2010-09-18 1 views
0
@interface{ 
    NSArray *array; 
} 
@property (nonatomic, retain) NSArray *array; 
@end 

@implementation 
@synthesize array; 
    self.array = [[NSArray alloc] init]; 
    array = [[NSArray alloc] init]; 

[self.array objectAtIndex:2]; [array objectAtIndex:2]; 
@end 

Есть ли разница между ними? Почему я должен использовать один над другим?Почему или почему бы не вызвать объект с «я». префикс?

+0

Возможный дубликат [Когда использовать свойства self on class?] (Http://stackoverflow.com/questions/867001/when-to-use-self-on-class-properties) – Chuck

ответ

4

self.array = foo является сокращением для [self setArray:foo] (т. Е. Вы получаете доступ к методам синтезированных свойств), а только array = foo непосредственно обращается к переменной экземпляра.

В этом случае вы создадите утечку памяти с self.array = [[NSArray alloc] init];, так как свойство сохранит ее, и счетчик ссылок будет таким образом равным 2 вместо 1. Так что лучше было бы: self.array = [NSArray array];.

Какой из них предпочтительнее - это почти вопрос вкуса, но использование свойств дает вам несколько преимуществ, таких как автоматическая поддержка кодирования ключевых значений. Это также является преимуществом, если вы когда-нибудь захотите реализовать setArray:, чтобы он мог делать дополнительные вещи, когда назначается массив (например, перезагрузка UITableView). С другой стороны, это немного медленнее, поскольку это дополнительный вызов метода (имеет значение только при вызове в цикле много). Но практически для всех приложений лучше быть как можно быстрее. Использование свойств позволяет упростить управление памятью.

3

Свойство «массив» объявляется сохраненным при назначении (сохранение в скобках после @property означает это). Поскольку он имеет то же имя, что и переменная экземпляра «array», она использует эту переменную экземпляра, поскольку она поддерживает хранилище.

Эффективно вызывая self.array = [[NSArray alloc] init]; такой же, как вызов array = [[[NSArray alloc] init] retain];

При назначении переменной экземпляра напрямую, не используя свойство, никаких действий не предпринимается на нем, поэтому массив просто указывает на новый экземпляр NSArray без сохранения Это.

+0

В качестве следствия для вышесказанного , 'self.array = [[NSArray alloc] init]' очень вероятно (фактически, почти наверняка) утечки; поскольку вы уже являетесь владельцем создаваемого объекта ('NSArray'), а затем ваше свойство сохраняет его, заставляя вас владеть им дважды. – jer

+0

Как получить доступ к данным, [self.array objectAtIndex: 2] vs [array objectAtIndex: 2] – ssj

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