[英]How to resolve problems when using autorelease on the iPhone?
我的問題是我正在使用NSSortDescriptor對數組進行排序,但我有一些泄漏。 我是 Objective C 的新手,雖然我有 C++ 的背景,但是我不太了解保留、釋放和自動釋放。 我的簡化代碼如下:
-(IBAction)sortByDate
{
NSSortDescriptor *Descriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:Descriptor];
NSArray *sortedArray =[productListe sortedArrayUsingDescriptors:sortDescriptors];
[productListe release];
productListe=nil;
productListe=[[NSMutableArray alloc]initWithArray:sortedArray];
[tableViewProduct reloadData];
NSLog(@"[Descriptor retainCount] =%i",[Descriptor retainCount]); //(return 2)
NSLog(@"[sortDescriptors retainCount] =%i",[sortDescriptors retainCount]); //(return 1)
NSLog(@"[sortedArray retainCount] =%i",[sortedArray retainCount]);//(return 1)
}
在Instruments中,我得到了這個泄漏列表:
NSSortDescriptor 0x80148a0 32 myProject -[myClass sortByDate]
__NSArrayI 0x80148c0 16 myProject -[myClass sortByDate]
__NSArrayReverseEnumerator 0x84079c0 16 UIKit -[UITableView reloadData]
__NSCFArray 0x8015f10 32 Foundation +[NSArray(NSArray) newWithContentsOf:immutable:]
Malloc 32 Bytes 0x800f330 32 Foundation +[NSArray(NSArray) newWithContentsOf:immutable:]
__NSArrayI 0xc914e90 352 Foundation -[NSArray(NSKeyValueSorting) sortedArrayUsingDescriptors:]
以下是我的問題:
這是我的第一個應用程序,也是我在論壇中的第一個問題,因此感謝您的所有回答。
感謝您的回答,很高興知道有人可以提供幫助。 我使用工具並在正確的位置釋放所有東西(我認為;)),但是當我嘗試對我的 tableview 進行排序時,應用程序崩潰(有 reloadData 和沒有它)。 如果你能說出儀器中的百分比(%)是什么意思?
現在我的儀器沒有泄漏(除了重新加載數據泄漏,但我認為你無法幫助我)她的照片是一張圖片,如果我使用 cmd+shift+A,你可以看到我擁有的東西(我不知道她的名字對不起 ):
我認為“ sortDescriptors ”是自動釋放的,但如果我不在儀器中釋放它,我有 50% 的泄漏????
想你。
當然不。 但是泄漏會引起麻煩。 特別是如果用戶使用它更長時間。 Apple 可能會拒絕您的應用程序,因為泄漏 memory 會導致崩潰。
您分配 memory 並初始化 NSSortDescriptor,但在完成后沒有正確釋放它。 經驗法則是如果您不再需要它,請盡快釋放它。 保留計數為 2,因為您將其添加到 NSArray object 中,當您添加它時,它會在描述符上發出保留消息。
憑借運氣和您發現 go 錯誤的地方的能力。 說真的,將 Instruments.app 與泄漏檢測監視器一起使用並使用您的應用程序。 您可以查看 memory 分配和保留/釋放,包括分配的對象的保留計數。 這是一個很大的幫助。
查看導致泄漏的堆棧跟蹤並識別您的部分並檢查它們是否正確保留/釋放。
對自動釋放對象的評論。 autorelease 將向當前的 NSAutoreleasePool object 添加一個條目。 如果您這么說並且在每個事件循環開始時,該池將耗盡。 有關詳細信息,請參閱 NSAutoreleasePool Class 參考。
因此,它通常不會在處理主線程上的方法時清理您的寶貴對象,因為這會阻塞您的主事件循環一段時間。
希望這會有所幫助
可能,但僅僅因為它獲得批准並不意味着你不應該堵塞泄漏。
閱讀 Objective-C 的 Memory 管理(例如Memory 管理編程指南)。
您不會發布在調用它時創建的 object。
運行構建/構建和分析或使用 Xcode 隨附的其他調試工具或使用外部應用程序
我無法解決您的應用商店問題,但我可以告訴您如何查找漏洞:運行 static 分析。 LLVM 將分析您的代碼,並詳細解釋每次泄漏發生的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.