Как правильно распределить память с помощью свойства? - PullRequest
0 голосов
/ 13 сентября 2011

Какой путь правильный?

NSString *c = [[NSString alloc] init];
self.character = c;
[c release];

или

self.character = [[NSString alloc] init];

И почему?Спасибо.

Ответы [ 4 ]

4 голосов
/ 13 сентября 2011

Зависит от того, как ваша собственность объявлена. Если вы использовали

@property (nonatomic, retain) NSString *someString;

Сеттер будет создан для сохранения someString, и в этом случае правильный путь - ваш первый метод. Если вы использовали:

@property (nonatomic, assign) NSString *someString;

Ваш второй метод будет правильным, поскольку он просто назначит указатель и ничего не сохранит.

3 голосов
/ 13 сентября 2011

Это зависит от того, как вы определили свою собственность.

Если это copy или retain, то синтезированный установщик (setCharacter: в вашем примере) получит право собственности на любые объекты, которые вы назначаете для свойства. В этой ситуации ваш первый пример верен. Второе приведет к утечке памяти, поскольку вы дважды заявили на право владения NSString, и вы (вероятно) откажетесь от владения только один раз; таким образом, память никогда не может быть восстановлена.

Если это assign, с другой стороны, сеттер не будет делать ничего особенного, и ваш второй пример будет верным. Первое приведет к ошибке EXC_BAD_ACCESS, если вы попытаетесь что-либо сделать с NSString. Должен отметить, что вы обычно используете assign только для примитивных типов и делегатов.

Я предлагаю вам прочитать Руководство по программированию для управления памятью и Объявленные свойства в руководстве по языку программирования Objective-C.

1 голос
/ 13 сентября 2011

Ответ зависит от вашего @property определения.Вероятно, это что-то вроде (retain) или (copy) для NSString.В этом случае присвоение self.character приведет к увеличению количества сохраняемых данных.Итак, нижняя часть:

self.character = [[NSString alloc] init];

Вы установили счет сохранения в 1 с помощью alloc, а self.character также сохранит его для счетчика 2, так что это будет утечка.Должно быть

self.character = [[[NSString alloc] init] autorelease];

или топовая версия.

0 голосов
/ 15 октября 2011

Ответ на это сейчас с iOS 5 заключается в использовании ARC.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...