繁体   English   中英

目标C-NSthread和NSAutoreleasePool?

[英]Objective C - NSthread & NSAutoreleasePool?

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

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

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

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

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

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

- (void) doSomething {
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM