0

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

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

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

4 回答 4

2

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

于 2010-10-28T21:24:57.203 回答
1

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

于 2010-10-28T21:24:47.940 回答
0

不管它对发布池意味着什么,我都不建议这样写。如果您绝对必须能够从主线程和其他线程调用该方法,请像这样编写代码:

- (void) doSomething {
}

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

这样,您将方法包装在一个负责释放池的方法中。

于 2010-10-28T21:30:29.493 回答
0

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

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

 @synchronized(lock) 
 {
    NSLog(@"Hello World");
 }
 [pool release];}
于 2010-10-29T07:21:57.250 回答