首页 > 关于iOS中引用计数的问题

关于iOS中引用计数的问题

我不是很明白其中“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);

这是个引用计数机制的问题,简单的来说,一个对象通过 alloc,copy 之类的初始化的时候,它的 retainCount 会变成1,每 retain 一次,retainCount 加1,每 release 一次,retainCount 减1,对象被加到集合(比如 array)里的时候会自动 retain 一次,被从集合里移除时,会自动 release。 当对象的 retainCount 变成 0 时,该对象会被标记为 free,原则上来说,这时候就不应该再访问该对象了, 因为它随时可能会被释放掉。

“非自己生成的对象,自己也能持有”就是指一个对象虽然不是自己生成的,但是你可以 retain 它,这样它的 retainCount 就是加 1,如果别的地方没有过度 release 的话,在你 release 它之前,它的 retainCount 至少是 1,这就跟你持有它是一样的。

你的后面两个问题在于你的测试代码用错了对象, NSString 并不走 retain/release 那一套,你可以把你的测试里的 NSString 都换成 NSMutableString 或者随便一个对象 ObjectA 试一试。

最后一个问题 person 被 release 之后 retainCount 应该是 0 了,为什么还能访问 person.name 呢?原因在于 person 指针指向的对象的 retainCount 达到 0 之后并不是会立即被清楚掉,可能需要等到下个 runloop,这时候 person 指针依然是指向着那个对象,而 name 又是个 NSString,所以可以访问。

【热门文章】
【热门文章】