rid*_*rid 3 memory-management objective-c
我有一个NSArray包含对象.我想创建一个NSArray只包含第一个中的一些对象的辅助NSArray.我有类似的东西:
[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if (something) {
[array2 addObject:obj]; // (1)
}
}];
[array1 release]; // (2)
Run Code Online (Sandbox Code Playgroud)
我认为这(1)将增加对象retainCount(将从1增加到2),然后(2)将减少它(对于添加的对象将从2增加到1,对于array2没有获得的对象从1增加到0)添加).
因此,我希望在执行此操作后,可以安全地访问对象array2,并且将取消分配未通过测试的不符合对象.
它是否正确?
假设不符合要求的对象未在其他地方保留,您的假设是正确的,并带有以下警告:
注意,这retainCount通常被认为是一个棘手的措施,最好是谈论问题是是否array1保留不符合对象的条款,而不参考retainCount.原因是它retainCount可能(并且经常)与您的期望不同.
另请注意,array2必须是NSMutableArray实例,否则无法调用addObject:.
在95%的情况下(组成统计数据),你不应该使用retain和release你自己,但是autorelease如果对象已经自动释放(例如,[NSMutableArray array]),则应该更喜欢使用(如果对象是NARCed,保留或复制新的alloc),或者根本不使用任何内容.