1

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

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

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

4

1 回答 1

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]];
    }
}

autorelease(如果不使用 ARC(或者,最好打开 ARC),则向复制的对象添加一个。)

这将要求您为您的班级实施copy

于 2013-07-04T04:59:59.123 回答