为什么这行Objective-C泄漏内存?

时间:2009-03-13 04:43:40

标签: iphone objective-c memory-management

我正在写一个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];
}

令我感到困惑的是,当我在模拟器和设备本身运行应用程序时,使用Instruments(内存泄漏),它告诉我viewDidLoad方法中的这一行正在泄漏一个数组:


self.selectedTags = sTags;

令人困惑,因为我使用了完全相同的技术和2个不同的变量,但第一个没有报告泄漏。

我觉得我在这里遗漏了一些明显的东西。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您的代码对我来说是正确的。 [Tag findAllTags][Tag findByFavoriteId:]中的一个是否可能泄漏?您确定在self.allTags中将self.selectedTagsnil设置为dealloc吗?

请注意说self.allTags = ...allTags = ...之间的区别。由于allTags是属性且具有retain属性,因此无论何时通过self.allTags = ...分配,它都会隐式调用setter方法[self setAllTags:...],该方法会调用retain新值和release旧值(如果有)。您在此代码示例中正确地执行了此操作,但如果您在其他地方直接指定allTags(没有self.),则表示您不是release旧值,可能是泄漏的来源。同样适用于selectedTags

答案 1 :(得分:0)

看看findByFavoriteId那里有retain吗?这是我在示例中使用的aTagssTags之间唯一的区别