【问题标题】:Dealing with objects returned from cocoa convenience methods处理从可可便捷方法返回的对象
【发布时间】:2008-11-01 17:48:26
【问题描述】:

我在 NSDate 对象被过早释放时遇到了很多问题。我怀疑这些问题可能与我处理从 NSDate 便捷方法返回的对象的方式有关。我认为我在 JKShow 类中的 showDate 属性声明应该是“保留”,但将其更改为分配或复制似乎对问题没有影响。

JKShow *show; 
NSDate *date;
NSMutableArray *list = [[NSMutableArray alloc] init];

// Show 1
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

// Show 2
show = [[JKShow alloc] init];
//...
date = [gregorian dateFromComponents:dateComponents];
show.showDate = date;
[list addObject:[show autorelease]];

更新

问题不在此处复制的代码中。在我的JKShow init 方法中,我没有保留从NSDate 便捷方法返回的日期。谢谢大家的帮助。

【问题讨论】:

    标签: cocoa nsdate autorelease convenience-methods


    【解决方案1】:

    从 dateFromComponents 返回的日期应该在自动释放池中,所以你的 showDate 属性应该是“保留”是正确的。事实上它应该是无论如何(除非你特别想要“复制”)。

    从您显示的代码看来,您将 show 对象的所有权完全授予列表(因为您在添加它们时设置了自动释放)。您是说日期对象在显示对象从列表中出来之前被释放(或者列表正在被释放)?

    另外,您是使用合成属性,还是手动编写它们?如果是后者,你的 setShowDate 属性方法是什么样的?

    你也可以尝试在不同的地方记录日期对象的retainCount(虽然我总是发现自动释放确实使这复杂化)。

    【讨论】:

      【解决方案2】:

      根据您发布的代码,如果 showDate 是一个足够的保留属性。其他东西(可能在 JKShow 的实现中)可能不正确。

      如果您想弄清楚发生了什么,您可以使用 Instruments 来查看对象的寿命。您需要使用分配工具集运行它以记住保留和释放。默认情况下,如果您运行泄漏性能工具,它会以这种方式设置。

      当您像这样运行 Instruments 时,它会记录所有对象的生命周期,以及针对它们发出的每个保留和释放的回溯。如果您查看对象,找到您的日期之一,并查看所有保留和释放,您应该能够确定虚假释放发生的位置。

      【讨论】:

      • 我现在正在调查这个问题,但只要我有你在这里,你如何解除仪器与你的项目的链接?过去我重启过xcode,但似乎肯定会有更好的方法。
      • 当您选择“Go”时,它会执行您上一次执行的操作(运行、调试、泄漏等)。只需明确选择运行,下次你点击 Go 时,它会在没有 Instruments 的情况下运行他的应用程序。
      【解决方案3】:

      您展示的代码没有过早发布问题。事实上,它会泄漏数组和其中的所有内容,因为它不会释放数组。

      您是否在垃圾收集器开启的情况下运行?

      list是实例变量还是静态变量,还是局部变量?

      【讨论】:

      • 列表对象稍后使用,我没有任何问题。没有垃圾收集。 List 是一个局部变量。
      【解决方案4】:

      我想通了,感谢您的所有帮助,但问题出在我在此处发布的代码之外。我没有保留在我的 init 方法中创建的NSDate。不幸的是,直到我创建了两个新的 NSDate 对象之后才发生崩溃,所以我完全是在找错树。

      【讨论】:

      • 将您的更新发布为对原始问题的编辑可能是个好主意。很高兴你找到了它 - 寻找这些东西总是很痛苦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      相关资源
      最近更新 更多