2012-05-23 2 views
4

Я следую официальный учебник Ваш второй IOS App: Раскадровка и сказал мне, чтобы объявить свойство masterBirdSightingList как это (только конкретный пример и не обязательно знать контекст):назначить NSMutableArray с @property и «копия» атрибут

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList; 

Обратите внимание, что есть атрибут копия. а затем синтезировать это свойство:

@synthesize masterBirdSightingList = _masterBirdSightingList; 

А рядом есть один метод инициализации, который заставил меня путать:

- (void)initializeDefaultDataList { 
NSMutableArray *sightingList = [[NSMutableArray alloc] init]; 
self.masterBirdSightingList = sightingList; 
[self addBirdSightingWithName:@"Pigeon" location:@"Everywhere"]; 
} 

Определенно sightingList выделяется для пространств, а затем ему присваивается свойству masterBirdSightingList. Однако свойство имеет атрибут . это означает, что переменная экземпляра _masterBirdSightingList будет выделена для другого пространства для сохранения материалов от sightingList. Зачем? Почему не непосредственно выделить место для свойства, как это:

self.masterBirdSightingList = [[NSMutableArray alloc] init]; 
+4

Они одинаковы. – kennytm

+0

Мне интересно знать утверждение self.masterBirdSightingList = sightingList - это просто операция копирования, которая копирует только ссылку или будет выделять новое пространство для хранения содержимого? thx – lookof

+2

Что-то стоит присмотреться: как правило, метод -copy «изменчивого» объекта возвращает непеременный вариант (в вашем случае NSArray). Чтобы исключить исключение, вы должны сами написать метод setter, чтобы вызвать -mutableCopy. –

ответ

7

В Objective-C, атрибут copy в собственности означает сеттер синтезированный будет выглядеть следующим образом:

-(void)setMasterBirdSightingList:(NSMutableArray*)newValue 
{ 
    if (_masterBirdSightingList == newValue) return; 
// NSMutableArray* oldValue = _masterBirdSightingList; 
    _masterBirdSightingList = [newValue copy]; 
// [oldValue release]; // <-- not applicable in ARC. 
} 

и синтаксис точка будет всегда переводятся на

[self setMasterBirdSightingList:sightingList]; 

независимо от его свойства.

Объект «выделение для другого места для сохранения материала из sightingList» осуществляется с помощью метода -copy. То, как вы передаете аргумент параметру newValue сеттера, не имеет значения.


Редактировать: Как @David упоминались в комментариях, то -copy метод изменяемого типа возвращает неизменный объект. Вы должны переопределить сеттер, чтобы вместо этого позвонить -mutableCopy. См. What's the best way to use Obj-C 2.0 Properties with mutable objects, such as NSMutableArray?.

+0

Я надеюсь, что сравнение будет с 'isEqual:'. –

+0

@HotLicks: Нет, их нельзя сравнивать с '-isEqual:'. '==' существует главным образом, чтобы избежать двойного выпуска, когда '-copy' возвращает одно и то же значение (возможно с неизменяемыми типами), и вы используете' self.foo = self.foo'. – kennytm

+1

Я посмотрел учебник, и он содержит инструкции по переопределению сеттера для сохранения изменчивости. –

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