2009-11-12 1 views
0

Я пытаюсь очистить свой код от утечек памяти, и у меня возникают проблемы с методом «release».Будучи хорошим владельцем памяти iPhone

Вот мой код:

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];

+3

Опубликовать код, который показывает, как распределяется URL-адрес? – marcc

ответ

0

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

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

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

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

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

Посмотрите на Memory Management Guide. Это должно быть обязательно чтение.

0

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

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

0

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

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