在 iPhone 上使用自动释放时如何解决问题?

Posted

技术标签:

【中文标题】在 iPhone 上使用自动释放时如何解决问题?【英文标题】:How to resolve problems when using autorelease on the iPhone? 【发布时间】:2011-08-10 21:49:53 【问题描述】:

我的问题是我正在使用 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:] 

这是我的问题:

    如果我的应用程序有漏洞,Apple 会拒绝它从 appstore 中删除吗? 如何在不崩溃的情况下释放所有对象。 为什么 reloadData 会泄漏。 如何在我的应用程序中跟踪泄漏,例如 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% 的泄漏????

想你。

【问题讨论】:

retainCounr 没用。不要叫它。 【参考方案1】:

    绝对不是。但是泄漏会引起麻烦。特别是如果用户使用它更长时间。 Apple 可能会拒绝您的应用程序,因为内存泄漏会导致崩溃。

    您分配内存并初始化 NSSortDescriptor,但在完成后没有正确释放它。经验法则是如果您不再需要它,请尽快释放它。 保留计数为 2,因为您将其添加到 NSArray 对象中,当您添加它时,该对象会在描述符上发出保留消息。

    凭借运气和您发现问题所在的能力。 说真的,将 Instruments.app 与泄漏检测监视器一起使用并使用您的应用程序。您可以查看内存分配和保留/释放,包括分配的对象的保留计数。这是一个很大的帮助。

查看导致泄漏的堆栈跟踪并识别您的部分并检查它们是否正确保留/释放。

关于自动释放对象的评论。 autorelease 将向当前的 NSAutoreleasePool 对象添加一个条目。如果您这么说并且在每个事件循环开始时,该池将耗尽。有关详细信息,请参阅 NSAutoreleasePool 类参考。

因此,它通常不会在处理主线程上的方法时清理您的宝贵对象,因为这会阻塞您的主事件循环一段时间。

希望对你有所帮助

【讨论】:

【参考方案2】:

    可能,但仅仅因为它获得批准并不意味着您不应该堵住漏洞。

    阅读 Objective-C 的内存管理(例如 Memory Management Programming Guide)。

    您没有释放在调用 this 时创建的对象。

    运行构建/构建和分析或使用 Xcode 附带的其他调试工具或使用外部应用程序

【讨论】:

【参考方案3】:

我无法解决您的应用商店问题,但我可以告诉您如何找到漏洞:运行静态分析。 LLVM 将分析您的代码,并详细解释每次泄漏发生的原因。

【讨论】:

以上是关于在 iPhone 上使用自动释放时如何解决问题?的主要内容,如果未能解决你的问题,请参考以下文章

iphone:多次自动释放对象

iphone内存管理问题

iphone基本发布问题

内存泄漏与自动释放的字符串 iphone

Iphone 打开 gl es 应用程序和自动释放池

iPhone:自定义自动释放池中的崩溃