【问题标题】:Why is this line of Objective-C leaking memory?为什么这行 Objective-C 会泄漏内存?
【发布时间】:2009-03-13 04:43:39
【问题描述】:

我正在编写一个 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 个不同的变量,但第一个变量没有报告泄漏。

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

【问题讨论】:

  • Instruments 具体告诉你什么?它通常只能告诉您在特定行的 allocated 对象已泄漏,但不能告诉您该行是泄漏的原因。如果您的代码中的其他内容过度保留或释放数组,那么它可能会泄漏,但您显示的代码将不负责。此外,您真的不应该使属性具有可变类型。这允许违反封装,外部代码可以改变其背后的对象的状态。

标签: iphone objective-c memory-management


【解决方案1】:

您的代码在我看来是正确的。 [Tag findAllTags][Tag findByFavoriteId:] 之一是否有可能泄漏?您确定在dealloc 中将self.allTagsself.selectedTags 设置为nil

注意self.allTags = ...allTags = ... 之间的区别。因为allTags 是一个属性并且具有retain 属性,所以无论何时通过self.allTags = ... 赋值,它都会隐式调用setter 方法[self setAllTags:...],该方法在新值上调用retain,在旧值上调用release (如果有的话)。您在此代码示例中正确执行了此操作,但如果您在其他地方直接分配给 allTags(没有 self.),则您不是 releaseing 旧值,这可能是泄漏。 selectedTags 也是如此。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 2011-03-29
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多