objective-c - 关于iOS中引用计数的问题
PHPz
PHPz 2017-04-17 17:53:18
0
1
245

我不是很明白其中“nsmutablearray类对象被赋值给变量obj,但obj自己并不持有该对象,使用retain可以持有该对象”这句话。

然后我在网上看到这个,应该是对应“非自己生成的对象,自己也能持有”这个情况,然后我写了下面的代码

NSMutableArray *array = [NSMutableArray arrayWithObjects: @"one", @"two", nil];  
NSString *elem = array[0];   
[array removeAllObjects];   
NSLog(@"%@", elem);

既然removeallobjects了就应该被dealloc了,为什么还能打印出elem呢?

还有第二种代码,person被release之后为什么还可以访问name

People *person = [[People alloc] init];
[person release];
NSString *name = person.name;
NSLog(@"%@", name);
PHPz
PHPz

学习是最好的投资!

모든 응답(1)
巴扎黑

이것은 참조 카운팅 메커니즘의 문제입니다. 간단히 말해서 객체가 할당, 복사 등을 통해 초기화될 때 해당 객체의 keepCount는 1이 됩니다. 유지될 때마다 keepCount는 1씩 증가합니다. 해제되면 keepCount 빼기 1. 개체가 컬렉션(예: 배열)에 추가되면 자동으로 한 번 유지되고 컬렉션에서 제거되면 자동으로 해제됩니다. 객체의 keepCount가 0이 되면 객체는 free로 표시됩니다. 객체는 언제든지 해제될 수 있으므로 지금은 더 이상 액세스하면 안 됩니다.

"직접 생성하지 않은 객체도 직접 보유할 수 있다"는 것은 자신이 생성하지 않은 객체라도 보유할 수 있으므로 보유 횟수가 1 증가한다는 의미입니다. 다른 곳에서 과도한 해제가 없는 경우, 해제하기 전에는 보유 개수가 1 이상이며 이는 보유하고 있는 것과 동일합니다.

마지막 두 가지 문제는 테스트 코드가 잘못된 개체를 사용한다는 것입니다. NSString은 테스트의 모든 NSString을 NSMutableString이나 ObjectA로 바꿀 수 있습니다.

마지막 질문은 person이 해제된 후에도 keepCount가 0이어야 한다는 것입니다. 왜 여전히 person.name에 액세스할 수 있나요? 그 이유는 사람 포인터가 가리키는 개체가 보유 개수가 0에 도달한 직후에 지워지지 않기 때문입니다. 이 때 사람 포인터는 여전히 해당 개체를 가리키고 이름은 다음 runloop까지 기다려야 할 수 있습니다. NSString이므로 액세스할 수 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿