将Objective-C对象从NSArray传递到NSArray

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,并且将取消分配未通过测试的不符合对象.

它是否正确?

Dan*_*ark 5

假设不符合要求的对象未在其他地方保留,您的假设是正确的,并带有以下警告:

  1. 注意,这retainCount通常被认为是一个棘手的措施,最好是谈论问题是是否array1保留不符合对象的条款,而不参考retainCount.原因是它retainCount可能(并且经常)与您的期望不同.

  2. 另请注意,array2必须是NSMutableArray实例,否则无法调用addObject:.

  3. 在95%的情况下(组成统计数据),你不应该使用retain和release你自己,但是autorelease如果对象已经自动释放(例如,[NSMutableArray array]),则应该更喜欢使用(如果对象是NARCed,保留或复制新的alloc),或者根本不使用任何内容.

  • 向dellocated对象发送消息是未定义的行为.它可能会破坏您的程序,或者它可能会使对象仍然存在且具有有效的保留计数,即使它不是,或者它可能会向您的老板发送脏电子邮件.(但前两者更有可能.) (2认同)