Быть хорошим гражданином iPhone памяти - PullRequest
0 голосов
/ 12 ноября 2009

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

Вот мой код:

NSArray *dict = [[NSArray alloc] initWithContentsOfURL:url];

if (dict == nil) {
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle:@"Error"
                          message:@"Cannot retrieve content.  Please try again later."
                          delegate:self
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
    [alert show];
    [alert release];
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
    return;
}
self.schedule = dict;
[dict release];
[url release]; //I receive a runtime error here, "BAD ACCESS"

Я не понимаю, почему, когда у меня не возникает та же проблема со строкой выше [dict release];

Ответы [ 3 ]

0 голосов
/ 12 ноября 2009

Поскольку вы не опубликовали код, показывающий, как был создан URL, вот общее правило:

Если создать объект с инициализатором, который начинается с «init», то вам, вероятно, следует его освободить. Если он создан другим способом (удобный метод), то он автоматически выпущен. Например:

NSArray *a = [[NSArray alloc]initWithContentsOfURL:url];   // release this later

NSArray *a = [NSArray arrayWithContentsOfURL:url];   // this will be auto released

По сути, вам просто нужно посмотреть, дал ли фреймворк объект с автоматическим выпуском или нет, потому что вы не можете выпустить объект с автоматическим выпуском, или вы (очевидно) получите сбой.

Взгляните на Руководство по управлению памятью . Это должно быть обязательным чтением.

0 голосов
/ 12 ноября 2009

Objective-C позволяет отправлять сообщения (например, «релиз») на ноль указателей без последствий.

Если указатель не равен нулю и указывает на что-то поддельное (то есть на освобожденный объект), вы получите исключение EXC_BAD_ACCESS. Откуда берется параметр url и каков его счетчик хранения ([url retainCount]) перед вызовом release?

0 голосов
/ 12 ноября 2009

Вы несете ответственность за вызов времени выпуска, вы звоните или выделяете, копируете или сохраняете.

В этом случае вы вызывали alloc на dict, но (предположительно, хотя и не показано, откуда берется url), а не на url.

...