【问题标题】:leak in @property setter@property setter 中的泄漏
【发布时间】:2011-09-20 17:34:42
【问题描述】:

我有一个自定义 UIView,我将它作为子视图添加到整个应用程序的多个位置。我通过设置一个属性向视图发送一个 NSMutable 数组,它会显示一个注释图。除了我的应用程序中的一个视图外,这很好用。我在包含图表的每个视图的 viewDidLoad 部分中使用此代码。

endNoteDisplay =[[NoteDisplay alloc] initWithFrame:CGRectMake(0,0,320,180)];
endNoteDisplay.tag = 100;
endNoteDisplay.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Note_Bkg.png"]];
NSMutableArray *tmpNts = [[NSMutableArray alloc] initWithObjects: @"C", @"E", @"G", @"A",nil];
endNoteDisplay.noteSpread = tmpNts;
[tmpNts release];
[self.view addSubview:endNoteDisplay];
[endNoteDisplay release];
  • 如果我删除 endNoteDisplay.noteSpread = tmpNts; 行,一切正常,没有泄漏。

  • 如果我将其留在 Instruments 中,则会显示内存泄漏。当我离开当前视图(显示笔记的地方)并返回到前一个视图(它有一个表格,其中列出了要显示的不同笔记选项)时,就会发生泄漏。

  • 我的应用程序按预期工作,这是唯一出现的泄漏。

谁能告诉我为什么会产生泄漏?我的NoteDisplay 中的noteSpread 属性设置为nonatomic retain

【问题讨论】:

标签: iphone objective-c ios memory-management memory-leaks


【解决方案1】:

NoteDisplay中的-dealloc方法是否释放noteSpread属性?

【讨论】:

    【解决方案2】:

    在 NoteDisplay 的 dealloc 中,您需要将 release 发送到支持 noteSpread 的实例变量。

    【讨论】:

    • +1 我同意这个答案。您上面的代码看起来不错。如果 NoteDisplay 类的 noteSpread 属性/变量泄漏,请确保在 NoteDisplay 的 dealloc 中释放 noteSpread
    • 这很完美!我没有在 NoteDisplay 类中发布支持 noteSpread 的 ivar。不知道为什么我在其他地方使用它时没有显示泄漏,但这解决了我的问题!
    【解决方案3】:

    你可以使用这个 combine 语句:

    endNoteDisplay.noteSpread = [NSMutableArray arrayWithObjects: @"C", @"E", @"G", @"A",nil];
    

    这将消除这两条线,

    NSMutableArray *tmpNts = [[NSMutableArray alloc] initWithObjects: @"C", @"E", @"G", @"A",nil];
    endNoteDisplay.noteSpread = tmpNts;
    

    并且还将消除泄漏:

    请务必在您完成工作后释放控制器中的“noteSpread”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2018-05-20
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多