物业似乎没有被使用?

时间:2011-02-10 11:04:52

标签: iphone objective-c cocoa-touch

这是我在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,保留在哪里?

3 个答案:

答案 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 = ...