这是我在Apple参考资料中遇到的问题 - Sample Code在研究如何使用NSTimer时,我不会问NSTimer那是seperate question但是我对使用@property,直接赋值给iVar(即不使用属性setter)和后续版本。
@property (nonatomic, retain) NSTimer *updateTimer;
...
@synthesize updateTimer;
...
updateTimer = [NSTimer scheduledTimerWithTimeInterval:.01 target:self selector:@selector(updateCurrentTime) userInfo:p repeats:YES];
...
...
updateTimer = nil;
...
...
// Dealloc method
[updateTimer release];
我的问题是,该属性是否被使用,似乎不是?同样发布,是否有效,如果没有使用@property setter,保留在哪里?
答案 0 :(得分:4)
保留在属性的定义中。 (即括号中的“(非原子,保留)”。)
如果该属性已被分配,那么它将在当时由“设置者”自动保留。
但正如您所说 从未使用过该属性本身,因此永远不会分配或保留该属性。
您可以在代码中看到的版本似乎完全错误,就像您说的那样。 ivar从未被保留过,因此释放会像Bjorn指出的那样崩溃。
(请注意,他们显然将它设置为零 - 当然你可以发送任何消息为零,但就像你说这是一个非常愚蠢的例子。你不能发布你从未保留过的东西。)
正如你所说,这个例子有点奇怪。没有理由做出财产:正如你所说它从未被使用过。相反,他们为什么要释放伊娃 - 从未保留过。
所以简而言之你的怀疑似乎是正确的!
该代码中至少有三个可怕的错误!
答案 1 :(得分:2)
你是对的,因为没有像self.updateTimer = something
或[self setUpdateTimer:something]
之类的电话,所以从不使用该属性。在release
“中发送-dealloc
消息”有效“因为您将updateTimer
重置为nil
。向nil
发送消息是完全正常的,但不会发生任何事情。如果您未将变量重置为nil
,则该消息将被发送到已解除分配的实例并导致EXC_BAD_ACCESS
异常。
答案 2 :(得分:0)
如果使用点,则调用属性方法。否则它是简单的任务。例如,foo = bar
将是赋值,而self.foo = bar
将导致属性方法被调用。
尝试使用self.updateTimer = ...
。