编写线程安全方法的最佳方法是什么?
我有以下方法,有时我想异步调用它(通过线程调用它) 有时我想直接在主线程上调用它。 即使我没有在单独的线程上调用该方法,是否存在保留池(alloc,release)的问题?
- (void)doStuff
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//do some stuff here?
[pool release];
}
答案 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];}