目标C - NSthread& NSAutoreleasePool?

时间:2010-10-28 21:20:56

标签: objective-c nsthread nsautoreleasepool

编写线程安全方法的最佳方法是什么?

我有以下方法,有时我想异步调用它(通过线程调用它) 有时我想直接在主线程上调用它。 即使我没有在单独的线程上调用该方法,是否存在保留池(alloc,release)的问题?

- (void)doStuff
{
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
     //do some stuff here?
     [pool release];
}

4 个答案:

答案 0 :(得分:2)

在主线程上调用是完全安全的。 NSAutoreleasePool维护一个堆栈,所以在这种情况下,你只需要在堆栈顶部放置一个新池,然后在完成后将其弹出。

答案 1 :(得分:1)

不,总是使用自己的方法本地池没有问题。不过,您应该使用[pool drain]代替[pool release]

答案 2 :(得分:0)

无论它对发布池意味着什么,我都不建议这样写。如果您必须能够从main和其他线程调用该方法,请按以下方式对其进行编码:

- (void) doSomething {
}

- (void) doSomethingInBackground {
    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
    [self doSomething];
    [pool release]
}

这样您就可以将方法包装在负责发布池的方法中。

答案 3 :(得分:0)

我也更喜欢Ivo Jansch提到的方法。创建/排空池是有效的,但是当您调用方法doStuff时可能会有点头疼:递归或多次。但是通过遵循Ivo的方法,你可以做一些没有内存头痛的事情。 而且对于一个线程安全的方法,你必须在需要时使用锁或@synchronized(),通常在访问数组/缓冲区/字典时。你的方法应该是这样的

- (void)doStuff{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 @synchronized(lock) 
 {
    NSLog(@"Hello World");
 }
 [pool release];}
相关问题