Ios 保留/释放-参考计数

Ios 保留/释放-参考计数,ios,ios4,Ios,Ios4,请指出我代码中的错误。我定义了一个自定义类型的变量idleTimer @属性(非原子,保留)IdleTimer*IdleTimer 然后,当我运行以下代码时,它崩溃了 IdleTimer *idleTimerTemp = [[IdleTimer alloc] initTimer:PERIOD_COUPON_POPUP]; idleTimer = idleTimerTemp; NSLog(@"Pt. 1 %d %d", [idleTimerTemp retainCount], [i

请指出我代码中的错误。我定义了一个自定义类型的变量idleTimer

@属性(非原子,保留)IdleTimer*IdleTimer

然后,当我运行以下代码时,它崩溃了

IdleTimer   *idleTimerTemp  =   [[IdleTimer alloc] initTimer:PERIOD_COUPON_POPUP];
idleTimer   = idleTimerTemp;

NSLog(@"Pt. 1 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]);

[idleTimer setDelegate:self];
[idleTimerTemp release];
NSLog(@"Pt. 2 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]);
如果再次使用idleTimer,它将崩溃

IdleTimer   *idleTimerTemp  =   [[IdleTimer alloc] initTimer:PERIOD_COUPON_POPUP];
idleTimer   = idleTimerTemp;

NSLog(@"Pt. 1 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]);

[idleTimer setDelegate:self];
[idleTimerTemp release];
NSLog(@"Pt. 2 %d %d", [idleTimerTemp retainCount], [idleTimer retainCount]);
但如果我在“idleTimer=idleTimerTemp”中保留idleTimerTemp,那么我就可以了。完全没有撞车


但是我的变量被定义为retain。怎么了?

您直接分配给
idleTimer
ivar,而不是使用访问器。改为这样做:

self.idleTimer = idleTimerTemp;

如果不使用属性访问器,则属性访问器无法实现您指定的语义。

您将直接分配给
idleTimer
ivar,而不是使用访问器。改为这样做:

self.idleTimer = idleTimerTemp;

如果不使用属性访问器,则属性访问器无法实现您指定的语义。

您的属性定义为
retain
,但这与作为属性备份存储的实例变量无关。大概在代码的某个地方,您已经完成了一个
@synthesis idleTimer。这将创建一个访问器对,用于实现您请求的内存管理


获得该行为的唯一方法是调用访问器本身。因此,如果您直接分配给
idleTimer
,则不会执行任何操作,但如果您使用
self.idleTimer=idleTimerTemp
,则会调用
-setIdleTimer:
访问器,它将保留参数。

您的属性定义为
retain
,但这与作为属性后备存储的实例变量无关。大概在代码的某个地方,您已经完成了一个
@synthesis idleTimer。这将创建一个访问器对,用于实现您请求的内存管理


获得该行为的唯一方法是调用访问器本身。因此,如果您直接分配给
idleTimer
,那什么也不做,但是如果您使用
self.idleTimer=idleTimerTemp
,那么将调用
-setIdleTimer:
访问器,它将保留参数。

我使用带有iOS 5的XCODE 4.2作为旁注。我使用带有iOS 5的XCODE 4.2作为旁注,。这样想:
self.idletimer=X
[self-setIdleTimer:X]
的缩写(带类型检查)。这样想:
self.idletimer=X
[self-setIdleTimer:X]
(带类型检查)的缩写。那么,在这种情况下,我不调用[idleTimerTemp release]是正确的方法吗?这是一种常见的做法吗?在这种情况下,您可能会在类的
-dealoc
方法中释放
idleTimer
。因此,在这种情况下,我不调用[idleTimerTemp release]是正确的方法吗?这是一种常见做法吗?在这种情况下,您可能会在类的
-dealoc
方法中释放
idleTimer