【问题标题】:Cocoa: Object getting autoreleased when it shouldn't可可:对象在不应该被自动释放时
【发布时间】:2012-01-12 19:41:53
【问题描述】:

首先,我应该说我使用的是 ARC,因此不能选择保留。该对象的类是 NSViewController 类型,并且有两个 NSTimer 以及几个文本字段和按钮。奇怪的是,当这两个计时器失效时,看起来对象正在被释放。这是一个问题,因为有时我只想暂停或重新启动它们,这意味着我必须使它们无效,但是一旦我这样做,引用就会丢失,并且对象的任何消息都会抛出 EXC BAD ACCESS。

我对内存管理或 ARC 不是很熟悉,但为什么引用丢失仅取决于计时器?我的意思是,仅仅因为它们无效并不意味着我不再需要该对象。

我尝试将计时器声明为实例变量和属性,但没有任何改变。

我真正需要的是不保留引用,即使两个计时器都无效。我做错了什么?

【问题讨论】:

    标签: cocoa nstimer automatic-ref-counting retain


    【解决方案1】:

    NSTimer 保留它的目标,因此如果它是对该对象的唯一引用,它将在计时器无效时被释放。您必须拥有您的对象的所有权,最好将其设为声明的强属性。

    编辑:将“委托”更改为“目标”;

    是的,您必须为它声明一个属性和(可能)一个实例变量。 release notes 是一个很好的例子,周围还有其他一些很好的介绍。如果您的所有者类被释放,请确保您使计时器无效,否则您的视图控制器将挂起。

    【讨论】:

    • 您的意思是“目标”,而不是“委托”。
    • 这听起来很有希望。所以在我的另一个类(创建这个对象的那个)中应该在它的头文件中声明这个对象?我应该使用哪个赋值来使它成为一个强大的属性?
    • @Francis McGrew 我还是有问题。我将类声明为(非原子的、强的)属性。问题是我需要该类的多个实例,当我创建第二个实例时,在我创建的前一个实例中重新启动 NSTimer 会引发 BAD ACCESS。我想第二个会覆盖第一个或其他东西,但它们应该是独立的。
    • 可能是因为当您重新设置属性时,它会释放旧值。您需要通过声明多个属性或将它们存储在一个集合中(如数组)来同时使用它们。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2011-09-13
    • 2012-07-02
    • 2019-05-31
    • 2016-04-25
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    相关资源
    最近更新 更多