保留/释放 - 参考计数

时间:2011-10-23 07:33:56

标签: ios ios4

请指出我的代码有什么问题。我定义了一个自定义类型的变量idleTimer

@property(nonatomic,retain)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”上保留了idleTimerTemp。没有崩溃。

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

2 个答案:

答案 0 :(得分:2)

您直接分配到idleTimer ivar而不是使用访问者。这样做:

self.idleTimer = idleTimerTemp;

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

答案 1 :(得分:2)

您的属性定义为retain但对于作为属性的后备存储的实例变量没有任何作用。大概在代码中的某个地方,你已经完成了@synthesize idleTimer;。这会创建一个访问者对,实现您请求的内存管理。

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