Как вы говорите, нужно ли освобождать объект? - PullRequest
0 голосов
/ 15 октября 2010

Можете ли вы описать разницу в соглашениях об именах между методом, который возвращает объект, который он выделил для вызывающего (и который должен освободить вызывающий объект), и методом, который возвращает объект автоматического освобождения?

Если вы объявляете свойство с атрибутом retain, нужно ли вам освобождать свойство, прежде чем установить его равным nil?

Что делает директива @synthesize?

Ответы [ 3 ]

3 голосов
/ 15 октября 2010

С яблочная документация

Вы выпускаете или высвобождаете только свои собственные объекты.Вы вступаете во владение объектом, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сообщение сохранения.

Вы используете release или autorelease, чтобы отказаться от владения объектом.autorelease означает просто «отправить сообщение о выпуске в будущем» (чтобы понять, когда это произойдет, см. «Пулы автоматического освобождения»).

Ваши вторые два вопроса связаны между собой.Все, что делает @synthesize, - это генерирует дополнительные методы для вашего файла реализации.Аргументы @property (неатомные, сохраняемые) NSString * myString;определить поведение генерируемых методов.Например, если вы объявите свойство как retain, сгенерированный метод setMyString сохранит свой аргумент.

Неатомарное значение важно, поскольку свойства по умолчанию являются потокобезопасными.Если вам не нужна безопасность потоков, вы можете убрать много накладных расходов в своих методах доступа.

Наконец, реализация свойства сохранения -

- (void) setMyString:(NSString*)newString {
    [newString retain];
    [myString release];
    myString = newString;
}

Итак, говоря self.myString = nil эффективно освобождает myString для вас.Многие люди выступают за использование self.property = nil для сохраненных свойств, в отличие от [освобождения собственности], хотя я думаю, что это просто сводится к личным предпочтениям.

1 голос
/ 15 октября 2010

Хороший источник для выделения памяти приведен Аароном.

Относительно @synthesize:

Скажем, у вас есть свойство P, вам нужно написать геттер и сеттер для него. Существует несколько общих подходов, один из которых заключается в том, что вы сохраняете этот объект, когда устанавливаете это свойство и освобождаете старое значение. Например:

- (void)setP:(PClass *)value
{
  [value retain];
  [_pInstanceVariable release];
  _pInstanceVariable = value;
}

Поскольку это очень распространенный фрагмент кода, компилятор может автоматизировать его для вас, если вы зададите ключевое слово retain в объявлении свойства, а затем выполните @synthesize в вашей реализации. Компилятор сгенерирует вышеупомянутый код, что означает, что ваш код будет намного чище без утомительных повторяющихся частей.

То же самое относится и к получателям, если вы не хотите что-то более сложное, чем:

- (PClass *)p
{
  return _pInstanceVariable;
}

@synthesize сделает работу

1 голос
/ 15 октября 2010

Информация о распределении памяти и именах может быть найдена здесь

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/ObjectiveC/Articles/ocAllocInit.html

синтез приведен здесь

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/ObjectiveC/Articles/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW17

Веб-сайт Apple имеетотличная документация, я бы рекомендовал сначала поискать там.

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