将Objective-C对象从NSArray传递到另一个NSArray

3

我有一个包含对象的NSArray。 我想创建一个次要的NSArray,其中只包含第一个NSArray中的某些对象。 我有类似以下的东西:

[array1 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (something) {
        [array2 addObject:obj]; // (1)
    }
}];
[array1 release]; // (2)

我认为(1)会增加对象的retainCount(从1增加到2),然后(2)会减少它(对于添加在array2中的对象,将其从2降低到1,对于未添加的对象,将其从1降低到0)。
因此,我期望在这样做之后,可以安全地访问来自array2的对象,并且未通过测试的不符合规范的对象将被释放。
这是正确的吗?

不确定是不是打错了,但你需要一个 NSMutableArray 来存储第二个数组。 - Paul.s
这,恐怕是一种不太理想的策略。你真的应该使用谓词来过滤array1。请参见+[NSPredicate predicateWithBlock:]-[NSArray filteredArrayUsingPredicate:]。这种更清晰的方法的一个附加好处是,你不必那么费心地考虑内存管理! :) - Jonathan Sterling
1个回答

5
假设不符合规范的对象没有被其他地方保留,您的假设是正确的,但需要注意以下几点:
1.请注意,retainCount通常被认为是一个棘手的度量标准,最好根据array1是否保留了不符合规范的对象来讨论问题,而不要参考retainCount。原因是retainCount可能与您的预期不同。
2.还要注意,array2必须是NSMutableArray实例,否则您无法调用addObject:方法。
3.在95%的情况下(虚构的统计数据),您不应该自己使用retain和release,而应该优先使用autorelease(如果对象是NARCed、新分配保留或复制的)或者根本不使用任何东西(例如[NSMutableArray array]已经自动释放)。

2
向已释放的对象发送消息是未定义行为。它可能会导致程序崩溃,或者让程序看起来像对象仍然存活并具有有效的保留计数,尽管实际上不是这样,或者它可能会向您的老板发送脏邮件。(前两种情况更有可能发生,但后一种情况也不可忽视。) - Chuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接