请指出我的代码有什么问题。我定义了一个自定义类型的变量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。怎么了?
答案 0 :(得分:2)
您直接分配到idleTimer
ivar而不是使用访问者。这样做:
self.idleTimer = idleTimerTemp;
如果不使用属性访问器,则属性访问器无法实现您指定的语义。
答案 1 :(得分:2)
您的属性定义为retain
但对于作为属性的后备存储的实例变量没有任何作用。大概在代码中的某个地方,你已经完成了@synthesize idleTimer;
。这会创建一个访问者对,实现您请求的内存管理。
获得该行为的唯一方法是调用访问者本身。因此,如果您直接分配给idleTimer
,则不会执行任何操作,但如果您使用self.idleTimer = idleTimerTemp
,则会调用-setIdleTimer:
访问者,这将保留参数。