2013-07-04 2 views
1

У меня есть NSArray, который представляет людей. Я использую одно из свойств класса Person для фильтрации массива и получения другого NSArray с использованием предиката.Фильтрует фильтр NSArrayArrayUsingPredicate: создает копии объектов?

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

ли новый NSArray, favorites, сохранить копию народа или ссылка, указывающая на старой NSArray, people? Если кто-то изменяет свойство Favorite на объект в массиве favorites, он автоматически обновляет этот объект в массиве people?

ответ

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))

Для этого вам понадобится implement copy.

+0

no Я действительно предпочитаю, чтобы они оставались со ссылками. Я предполагаю, что по умолчанию объектив C сохраняет эту копию по ссылке. – funkycoldmedia

+0

Я не уверен, что вы подразумеваете под «копией по ссылке». –

+0

извините Пропустить по ссылке. – funkycoldmedia

Смежные вопросы