簡體   English   中英

在 iPhone 上使用自動釋放時如何解決問題?

[英]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:] 

以下是我的問題:

  1. 如果我的應用程序有一些泄漏,Apple 會從 appstore 拒絕它嗎?
  2. 如何在不崩潰的情況下釋放所有對象。
  3. 為什么 reloadData 會泄漏。
  4. 如何在我的應用程序中跟蹤諸如 Foundation 泄漏之類的泄漏。

這是我的第一個應用程序,也是我在論壇中的第一個問題,因此感謝您的所有回答。


感謝您的回答,很高興知道有人可以提供幫助。 我使用工具並在正確的位置釋放所有東西(我認為;)),但是當我嘗試對我的 tableview 進行排序時,應用程序崩潰(有 reloadData 和沒有它)。 如果你能說出儀器中的百分比(%)是什么意思?

現在我的儀器沒有泄漏(除了重新加載數據泄漏,但我認為你無法幫助我)她的照片是一張圖片,如果我使用 cmd+shift+A,你可以看到我擁有的東西(我不知道她的名字對不起 ):

https://lh6.googleusercontent.com/-cjs_IGsE1Vw/TkccLmyAsGI/AAAAAAAAAEA/YrkE9fUS9XA/Capture%252520d%2525E2%252580%252599e%2525CC%252581cran%2525202011-08-14%252520a%2525CC%252580%25252001.48.43.png

我認為“ sortDescriptors ”是自動釋放的,但如果我不在儀器中釋放它,我有 50% 的泄漏????

想你。

  1. 當然不。 但是泄漏會引起麻煩。 特別是如果用戶使用它更長時間。 Apple 可能會拒絕您的應用程序,因為泄漏 memory 會導致崩潰。

  2. 您分配 memory 並初始化 NSSortDescriptor,但在完成后沒有正確釋放它。 經驗法則是如果您不再需要它,請盡快釋放它。 保留計數為 2,因為您將其添加到 NSArray object 中,當您添加它時,它會在描述符上發出保留消息。

  3. 憑借運氣和您發現 go 錯誤的地方的能力。 說真的,將 Instruments.app 與泄漏檢測監視器一起使用並使用您的應用程序。 您可以查看 memory 分配和保留/釋放,包括分配的對象的保留計數。 這是一個很大的幫助。

查看導致泄漏的堆棧跟蹤並識別您的部分並檢查它們是否正確保留/釋放。

對自動釋放對象的評論。 autorelease 將向當前的 NSAutoreleasePool object 添加一個條目。 如果您這么說並且在每個事件循環開始時,該池將耗盡。 有關詳細信息,請參閱 NSAutoreleasePool Class 參考。

因此,它通常不會在處理主線程上的方法時清理您的寶貴對象,因為這會阻塞您的主事件循環一段時間。

希望這會有所幫助

  1. 可能,但僅僅因為它獲得批准並不意味着你不應該堵塞泄漏。

  2. 閱讀 Objective-C 的 Memory 管理(例如Memory 管理編程指南)。

  3. 您不會發布在調用它時創建的 object。

  4. 運行構建/構建和分析或使用 Xcode 隨附的其他調試工具或使用外部應用程序

我無法解決您的應用商店問題,但我可以告訴您如何查找漏洞:運行 static 分析。 LLVM 將分析您的代碼,並詳細解釋每次泄漏發生的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM