2011-10-23 53 views
0

请指出我的代码中出了什么问题。我定义了自定义类型的变量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。根本没有崩溃。

但我的变量被定义为保留。哪里不对 ?

+0

我使用XCODE 4.2与iOS5 – SkyEagle888

+0

作为边注,[-retainCount是不是所有的有用](http://stackoverflow.com/questions/4636146/when-to-use-retaincount/4636477#4636477 )。 –

回答

2

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

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

+0

那么,在这种情况下,我没有调用[idleTimerTemp release]是否是一种正确的方法?这是常见的做法吗? – SkyEagle888

+0

在这种情况下,您可能会在您的类的“-dealloc”方法中释放“idleTimer”。 –

2

您直接分配给idleTimer伊娃,而不是使用访问器。请改为:

self.idleTimer = idleTimerTemp; 

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

+1

想想这样:'self.idletimer = X'是'[self setIdleTimer:X]'的缩写(带有类型检查)。 – titaniumdecoy