NSArray的filteredArrayUsingPredicate:创建对象的副本吗?

时间:2013-07-04 04:52:02

标签: cocoa-touch nsarray

我有一个代表人的NSArray。我使用Person类的一个属性来过滤数组,并使用谓词来获取另一个NSArray

   NSPredicate * predicate = [NSPredicate predicateWithFormat:@"Favorite == %@", @"YES" ];
   NSArray *favorites = [people filteredArrayUsingPredicate:predicate];

NSArrayfavorites是否维护人员的副本或指向旧NSArraypeople的引用?如果有人更改了Favorite数组中某个对象的属性favorites,它会自动更新people数组中的该对象吗?

1 个答案:

答案 0 :(得分:3)

新阵列不会复制。您对原始对象有正常引用,因此,如果其中一个属性发生更改,您将通过两个数组看到新值。数组在创建之后根本没有连接;情况与:

相同
NSString * s = @"Cabbage crates coming over the briny!";
NSString * t = s;

您对同一个对象有两个单独的引用。

如果您需要,您必须制作明确的副本:

NSMutableArray * favorites = [NSMutableArray array];
for( Person * person in people ){
    if( [predicate evaluateWithObject:person] ){
        [favorites addObject:[person copy]];
    }
}

(如果不使用ARC,则向复制的对象添加autorelease(或者,更好的是,启用ARC)。)

这需要您implement copy为您的班级。