Почему у этой линии Objective-C утечка памяти? - PullRequest
1 голос
/ 13 марта 2009

Я пишу приложение для iPhone. У меня есть файл заголовка, который выглядит так:


@interface EditTagsViewController : UITableViewController {
  NSMutableArray *allTags;
  NSMutableArray *selectedTags;
  NSInteger currentFavorite;
}
@property (nonatomic, retain) NSMutableArray *allTags;
@property (nonatomic, retain) NSMutableArray *selectedTags;
@property (nonatomic) NSInteger currentFavorite;
@end

В файле реализации мой метод viewDidLoad выглядит следующим образом:


- (void)viewDidLoad {
  NSMutableArray *aTags = [[NSMutableArray alloc] initWithArray:[Tag findAllTags]];
  self.allTags = aTags;
  [aTags release];

  NSMutableArray *sTags = [[NSMutableArray alloc] initWithArray:[Tag findByFavoriteId:currentFavorite]];
  self.selectedTags = sTags;
  [sTags release];

  UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewTag:)];
  self.navigationItem.rightBarButtonItem = add;
  [add release];
  [super viewDidLoad];
}

Вот мой метод dealloc:


- (void)dealloc {
  [allTags release];
  [selectedTags release];
  [super dealloc];
}

Что меня смущает, так это то, что когда я запускаю приложение как в симуляторе, так и на самом устройстве, используя инструменты (утечки памяти), оно говорит мне, что эта строка в моем методе viewDidLoad пропускает массив:


self.selectedTags = sTags;

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

Я чувствую, что упускаю что-то очевидное здесь. Есть идеи?

Ответы [ 2 ]

1 голос
/ 13 марта 2009

Ваш код выглядит правильно для меня. Возможно ли, что один из [Tag findAllTags] или [Tag findByFavoriteId:] протекает? Обязательно установите self.allTags и self.selectedTags в nil в dealloc?

Помните о разнице между словами self.allTags = ... и allTags = .... Поскольку allTags является свойством и имеет атрибут retain, всякий раз, когда вы назначаете с помощью self.allTags = ..., он неявно вызывает метод установки [self setAllTags:...], который вызывает retain для нового значения и release для старого значения (если есть). Вы делаете это правильно в этом примере кода, но если в другом месте вы присваиваете allTags (без self.), вы не release используете старое значение, которое может быть источником протечь. Аналогично для selectedTags.

0 голосов
/ 13 марта 2009

Посмотрите на findByFavoriteId есть ли там retain? Это единственное различие, которое я вижу между aTags и sTags, используемыми в вашем примере

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