在那段代码中,我有两个NSLog,说dict的保留计数为1。 由于如果阵列中有很多对象,可以长时间触发计时器,我可以保留给用户信息的dict吗?因为我猜它是autorelease,并且scheduledTimerWithTimeInterval似乎没有保留它。
Theoricaly? 实际上?
- (void) doItWithDelay
{
NSArray* jobToDo = /* get an autorelease array */
NSTimeInterval nextLaunch = 0.1;
int i=1;
for (NSDictionary* dict in jobToDo) {
NSLog(@"dict %d has %d retain count", i++, [dict retainCount]);
// HERE [dict retain] ???
[NSTimer scheduledTimerWithTimeInterval:nextLaunch target:self selector:@selector(doIt:) userInfo:dict repeats:NO];
nextLaunch += 1.0;
}
}
- (void) doIt:(NSTimer*)theTimer
{
NSDictionary* dict = [theTimer userInfo];
NSLog(@"dict has now %d retain count", [dict retainCount]);
// Do some stuff with dict
}
答案 0 :(得分:4)
Apple NSTimer文档称它将保留userInfo。以下是从文件中引用的......
您指定的对象由计时器保留,并在计时器失效时释放。
你的第二个NSLog说1,所以我猜它已经被自动释放但是计时器仍然保留它。
编辑:正如bbum所说,我们不应该依赖保留计数。所以我们很幸运,医生明确说明了这一点。
答案 1 :(得分:3)
正如Khomsan所说,文档明确声明该对象被保留。
故事结束。
retainCount
没用;别叫它。对象的绝对保留计数是实现细节。
答案 2 :(得分:0)
在尝试使用用户信息之前不要使NSTimer无效。