2009-10-29 31 views
6

我即將結束我的第一個iPhone應用程序,並認爲我會通過泄漏性能工具運行它。在修復了一個明顯的問題之後,我剩下的唯一一個用一個Nib作爲通過loadNibNamed加載的表頭視圖(我在這裏遵循Recipes演示)。loadNibNamed中的內存泄漏?


- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (self.tableHeaderView == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"TableHeaderView" owner:self options:nil]; 
     self.tableView.tableHeaderView = self.tableHeaderView; 
    } 
} 

然後在dealloc中:


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

儀器告訴我,我泄漏256個字節,2個泄漏從loadNibNamed行的到來。 tableHeaderView是Nib中唯一的頂級對象(我已經在調試器中驗證過)。有什麼我忘記發佈?我誤解了樂器告訴我什麼?這是錯的嗎?操作系統稍後會清理嗎?

+1

您不必NSZombieEnabled你呢?這將顯示儀器中的錯誤泄漏。 – nall

+0

如果那是我不得不離開我的方式去做的事情。它默認關閉了嗎? – AndrewO

+0

良好的通話。我爲此瘋狂了。我有殭屍。 – RyeMAC3

回答

2

是儀器告訴你這只是在模擬器上,或者將其報告在實際設備上是一回事嗎?如果你不明白這一點在設備上,那麼它的模擬器 - 這是確有發生(這不是一個確切的匹配)。

另外,倒在dealloc中,豈不是[self.tableHeaderView release]?你必須與你的使用保持一致。

爲了避免混淆,在你的.h,你這樣聲明:

NS/UI/??xxxxxx *_MyObjectName; //notice the underscore 

則該屬性是這樣的:

@property .... NS/UI/??xxxxxx *MyObjectName; //no underscore 

然後合成的getter/setter方法是這樣的:

@synthesize MyObjectName=_MyObjectName; 

最後,請參考整個程序中的對象[self.MyObjectName ...];

+0

關於該設備的好問題:我正在設置我的設備,以便在那裏進行實際測試 - 我將在工作時進行更新。 我試着改變釋放調用dealloc使用自我,沒有改變。我以爲我會在某個地方看到一個人應該避免在dealloc中使用糖(儘管我猜沒有自己調用它會不會更好)?還是僅僅是二傳手? – AndrewO

+0

我傾向於保持屬性的本地版本不變,除非我必須(像它是隻讀的)。否則,我總是自己訪問它。我建議你看一下蘋果的樣品,但即使是第一個學習者應用程序也顯示出同樣的弱點。至少:如果你保持這個紀律,你可以稍後做一個查找/替換把它切換到別的。正確或錯誤,只要堅持不懈! 玩弄設備配置文件。代碼簽名的發佈也很有趣!最好的選擇是使用Apple的指導 - 真的。 – inked

+0

下劃線的用途是什麼? – RyeMAC3

5

當加載筆尖,你負責釋放所有頂級對象的筆尖文件。除了TableHeaderView之外,該文件中還有什麼?

+0

不能 - 我確認它是nib文件中唯一的頂級對象。 – AndrewO

+0

你聽起來像你知道你在說什麼,但我沒有發現任何地方記錄。實際上,loadNibNamed狀態的文檔「您應該保留返回的數組或手動包含的對象,以防止提前釋放nib文件對象。」 - 你能否詳細說明/參考? 10倍! –