NSMutableArray initWithContentsOfFile утечка памяти - PullRequest
2 голосов
/ 18 января 2010

Я новичок в разработке для iPhone, и у меня утечка памяти.

Я использую NSMutableArray для получения содержимого файла .plist, расположенного в каталоге Documents.

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

Это мой код:

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  NSArray *paths = NSSearchPathForDirectoriesInDomains
                       (NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];
     //make a file name to write the data to using the
     //documents directory:
  fullFileName = [NSString stringWithFormat:@"%@/SavedArray", documentsDirectory];
     //retrieve your array by using initWithContentsOfFile while passing
     //the name of the file where you saved the array contents.
  savedArray = nil;
  savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName];
  self.composedArray = [savedArray copy];
  [savedArray release];
  [self.tableView reloadData];
}

Я освобождаю его каждый раз, когда вид исчезает

- (void)viewWillDisappear:(BOOL)animated {
  [super viewWillDisappear:animated];
  [composedArray release];
  composedArray = nil;
  [savedArray release];
}

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

savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName];

Я не знаю, как решить эту утечку, если кто-то может поделиться каким-либо решением этого, я был бы очень признателен.

Заранее спасибо.

1 Ответ

5 голосов
/ 19 января 2010

Как выглядит декларация о недвижимости composedArray?

Если декларация:

@property(retain) id composedArray;

вот где утечка памяти. copy увеличивает счетчик ссылок, как и retain. Если в любое время вы назначаете composedArray, вы будете назначать копию (как кажется, читая ваш код), вы должны объявить свою собственность как:

@property(copy) id composedArray;

, а затем измените код на:

self.composedArray = savedArray;

(копия произойдет в синтезированном методе доступа).

...