Cocoa:对象在不应';T

Cocoa:对象在不应';T,cocoa,nstimer,automatic-ref-counting,retain,Cocoa,Nstimer,Automatic Ref Counting,Retain,首先,我应该说我使用的是ARC,所以保留不是一个选项。该对象的类为NSViewController类型,具有两个NSTimer以及多个文本字段和按钮。奇怪的是,当这两个计时器失效时,看起来对象被释放了。这是一个问题,因为有时我只想暂停或重新启动它们,这意味着我必须使它们无效,但一旦我这样做,引用就会丢失,任何指向对象的消息都会抛出EXC错误访问 我不太熟悉内存管理或ARC,但为什么引用丢失仅取决于计时器?我的意思是,仅仅因为它们无效并不意味着我不再需要这个对象了 我尝试将计时器声明为实例变量和属

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

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

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


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

NSTimer
保留其目标,因此,如果它是对对象的唯一引用,则当计时器无效时,它将被解除分配。你必须拥有你的物品的所有权,最好是将它声明为强属性

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

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

您的意思是“目标”,而不是“委托”。这听起来很有希望。那么在我的另一个类(创建这个对象的类)中,应该在它的头文件中声明这个对象吗?“我应该使用哪种赋值使其成为强属性?”弗朗西斯·麦克格鲁(Francis McGrew)我仍然有一个问题。我将该类声明为(非原子,强)属性。问题是我需要几个类的实例,当我创建第二个实例时,重新启动前一个实例中的NSTimer会抛出错误的访问。我想第二个会覆盖第一个或其他东西,但它们应该是独立的。可能是因为当你重新设置属性时,它会释放旧的值。您需要同时保留这两个属性,可以声明多个属性,也可以将它们存储在一个集合(如数组)中。