iPhone - scheduledTimerWithTimeInterval会保留userInfo参数吗?

时间:2011-07-30 23:55:06

标签: iphone cocoa memory-management nstimer retain

在那段代码中,我有两个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
}

3 个答案:

答案 0 :(得分:4)

Apple NSTimer文档称它将保留userInfo。以下是从文件中引用的......

  

您指定的对象由计时器保留,并在计时器失效时释放。

你的第二个NSLog说1,所以我猜它已经被自动释放但是计时器仍然保留它。

编辑:正如bbum所说,我们不应该依赖保留计数。所以我们很幸运,医生明确说明了这一点。

答案 1 :(得分:3)

正如Khomsan所说,文档明确声明该对象被保留。

故事结束。

retainCount没用;别叫它。对象的绝对保留计数是实现细节。

答案 2 :(得分:0)

在尝试使用用户信息之前不要使NSTimer无效。