2009-08-26 24 views
2

我正在清理我的電話簿iPhone應用程序中的代碼和儀器中的泄漏工具報告,我泄漏NSCFString對象。下面是我下面的模式:Objective C NSCFString泄漏與NSMutableArrays

我在我的應用程序中的Person類有什麼比當地的NSString成員和名字關聯的屬性更多,姓氏等

我的看法控制器有一個從searchBarSearchButtonClicked事件中的SQLite數據庫填充的NSMutableArray屬性。這個NSMutableArray填充了將用於填充我的tableview控件的Person對象。另外,如果用戶點擊視圖中的某個人,他們的Person對象將被傳遞給Detail視圖,以查看其他信息而不僅僅是名稱。

當我執行第一次查找並顯示結果時,沒有內存泄漏。

現在,當我執行第二次查找時,我希望清除NSMutableArray並重新裝入新的結果集而不會泄漏內存。因此,要做到這一點,我呼籲我的personList財產removeAllObjects,然後調用數據庫重新填充personList NSMutableArray中,如下圖所示:

[self.personList removeAllObjects]; 
self.personList = [SearchService GetPersonList:searchText]; 
[list reloadData]; 

通過調用removeAllObject我已經擺脫了,我曾經有過泄漏與Person對象關聯。但是,現在我正在泄漏單個Person對象的屬性中剩餘的NSString對象。

這可能嗎?

我是儀器工具的新手,但從擴展細節中可以看出,當我鑽入NCSFString泄漏之一時,堆棧中的最後一行代碼常常指向@synthesize代碼行財產,如:

@synthesize firstName; 

所以,這就是爲什麼我認爲這些NSStrings沒有得到清理。有沒有更好的方式來做到這一點,不會產生內存泄漏?

+0

如果您可以發佈您的Person類的代碼,可能更容易診斷正在發生的事情。 – Mark 2009-08-26 15:25:07

回答

3

您是否在您的Person類的dealloc方法中發佈NSString s?

假設你設置你的財產像這樣:

@property (retain) NSString *firstName; 

當使用二傳手設定firstName,它將會被保留。如果Person實例隨後被釋放並釋放,但firstName尚未釋放,則會泄漏。

把它放在dealloc方法在Person類:

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

(假設用於您firstName屬性對應的伊娃被稱爲firstName)。

+0

這似乎工作。但是,XCode 3.2.1中的代碼分析器在dealloc方法中對我的發行版進行了評論:「調用者此時不擁有引用計數的不正確遞減」。想法? – rtemp 2009-10-21 00:50:01

+0

代碼分析器考慮在'-dealloc'中使用訪問器方法,並警告你這一點 - 關於在init和dealloc中使用訪問器是否有效這個問題存在爭議,但我認爲普遍的共識是引導清除並直接訪問ivars(抱歉應該在之前指出)。 – 2009-10-21 05:59:13

+0

這對我來說雖然我的屬性設置是:@property(nonatomic,assign)NSString * name; – 2015-07-26 18:51:15