2011-09-20 63 views
2

我有一個自定義的UIView,作爲子視圖在幾個地方添加到我的應用程序中。我通過設置屬性發送視圖NSMutable陣列,並顯示註釋圖。這工作正常,除了我的應用程序中的一個視圖。我在包含圖的每個視圖的viewDidLoad部分中使用此代碼。@property setter中的泄漏

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;線一切正常就好了無泄漏。

  • 如果我把它放在樂器中顯示內存泄漏。當我離開當前視圖(顯示註釋的位置)並返回到上一個視圖(它有一個包含不同註釋選項列表的顯示錶)時,會發生泄漏。

  • 我的應用程序按預期工作,這是即將發生的唯一泄漏。

有人可以告訴我爲什麼這會產生泄漏?我的NoteDisplay中的noteSpread財產設置爲nonatomic retain

+1

[儀器說可能有重複,我有內存泄漏,但我沒有看到它](http://stackoverflow.com/questions/3214327/instruments-says-i-have-a-memory-leak- but-i-dont-see-it) – Caleb

回答

1

在NoteDisplay的dealloc中,您需要將release發送給支持noteSpread的實例變量。

+0

+1我同意這個問題。你的代碼看起來很好。如果NoteDisplay類的noteSpread屬性/變量泄漏,請確保在「NoteDisplay」的dealloc中釋放'noteSpread'。 – Sam

+0

這完美解決了!我還沒有發佈在NoteDisplay類中支持noteSpread的ivar。不知道爲什麼當我在其他地方使用它時沒有顯示泄漏,但是,這解決了我的問題! – Frank

-2

你可以使用這個組合聲明:

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

這將消除這兩條線,

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

,也將刪除泄漏:

只是一定要釋放「當你完成你的工作時,在控制器中註釋「Spread」。

3

NoteDisplay中的-dealloc方法是否釋放noteSpread屬性?