вопрос управления памятью какао - PullRequest
1 голос
/ 12 марта 2011

Я спорю с другом, который говорит, что я должен поставить здесь автопереключение:

NSURL *url = [[NSURL URLWithString:@"http://origin-www.metrolyrics.com/api/widgets/mac/seeker.php"] autorelease];

Но не является ли объект автоматически автоматически освобожденным, когда он был отправлен мне из метода класса NSURL? Спасибо.

Ответы [ 2 ]

5 голосов
/ 12 марта 2011

Это правило:

Если вы вызываете метод, который возвращает объект и:

  • начинается с new
  • начинается с alloc
  • is retain
  • содержит copy

, тогда вы несете ответственность за освобождение (или автоматическое освобождение) возвращенного объекта.В только раз этого не будет, если в документации указано иное.Вы также можете увидеть в заголовочных файлах, что метод аннотирован макросом NS_RETURNS_RETAINED.(Заголовочный файл считается документацией)

Простой способ запомнить это "NARC" (new-alloc-retain-copy).

В вашем примере, поскольку URLWithString: неначинаются с new или alloc, не содержат copy и не retain, тогда вы не должны освобождать возвращаемый объект.Это является нарушением руководящих принципов управления памятью и приведет к сбою приложения (если вы не делаете глупостей в другом месте).

4 голосов
/ 12 марта 2011

Вы правы. вы не выделяете или копируете объект, поэтому вы не должны его освободить. Просто используйте свой код без автоматического выпуска. ; -)

Метод Class, который вы использовали, выглядит следующим образом: (Обычно это так. Мы не можем этого знать, потому что Apple не передает код.)

+(id)URLWithString:(NSString *)aString {
    return [[[self alloc] initWithString:aString] autorelease];
}
...