对于Objective-C中的NSThread,这是一种可以接受的习惯用法吗?

对于Objective-C中的NSThread,这是一种可以接受的习惯用法吗?,objective-c,nsthread,gnustep,Objective C,Nsthread,Gnustep,我有一个小的基于代理的建模框架,这是我作为项目的一部分编写的。不同的代理都在各自的线程中运行,并且一个supervisor类控制它们的生命周期。因此,supervisor类可以取消这些线程。我知道在NSThread上有一个isCancelled方法。使用该术语,以下习语是否可以接受: #import <Foundation/Foundation.h> #import "BugThread.h" #import "Bug.h" @implementation BugThread -

我有一个小的基于代理的建模框架,这是我作为项目的一部分编写的。不同的代理都在各自的线程中运行,并且一个supervisor类控制它们的生命周期。因此,supervisor类可以取消这些线程。我知道在
NSThread
上有一个
isCancelled
方法。使用该术语,以下习语是否可以接受:

#import <Foundation/Foundation.h>
#import "BugThread.h"
#import "Bug.h"

@implementation BugThread

- (id) initWithBug: (Bug*) aBug {

    if((self = [super init])) {
        [bug autorelease];
        bug = [aBug retain];
    }

    return self;
}

- (void) main {

    GSRegisterCurrentThread();

    while(![self isCancelled]) {
        //bug does its stuff
    }
}
#导入
#导入“BugThread.h”
#导入“Bug.h”
@实现错误线程
-(id)initWithBug:(Bug*)aBug{
if((self=[super init])){
[错误自动释放];
错误=[aBug retain];
}
回归自我;
}
-(无效)主要{
GSRegisterCurrentThread();
而(![自我取消]){
//虫子做自己的事
}
}

我想这么说,因为这一点在:

如果您的线程支持取消,它应该定期调用此方法,如果返回YES,则退出


不过,我建议您查看一下
NSOperation
NSOperationQueue
。它们的目的是在代表您管理实际线程时允许这种并发性。请参阅《并发编程指南》。

我会这么说,因为这在以下章节中有明确说明:

如果您的线程支持取消,它应该定期调用此方法,如果返回YES,则退出


不过,我建议您查看一下
NSOperation
NSOperationQueue
。它们的目的是在代表您管理实际线程时允许这种并发性。请参阅《并发编程指南》。

在自动删除对象之前,您应该始终保留该对象。没有任何内容表明对象不能在幕后调用
自动删除。@RichardJ.RossIII抱歉,这是一个打字错误!它应该是
[bug自动释放]
@Richard
autorelease
使对象归顶级自动释放池所有,在控件离开当前方法之前,该池不会被清空。不过,这里有一个问题-
init
运行后,
bug
中的对象不属于此
BugThread
。Vivin,你不应该向那个对象发送
autorelease
,它不属于这里。你能更好地解释最后一部分吗?什么意思是
bug
不属于
BugThread
?很抱歉,这里几乎是Objective-C新手。这是基本知识:如果你需要一个对象生存,你可以通过
alloc
copy
创建它,或者保留它来获得所有权。当您不再需要该对象时,必须放弃所有权。当对象传递给方法时,您并不拥有它。如果你没有拥有一个对象,你不能向它发送
release
(包括通过
autorelease
)。在自动释放对象之前,你应该始终保留一个对象。没有任何东西说一个对象不能在幕后调用
release
。@RichardJ.rossii抱歉,那是一个打字错误!它应该是
[bug自动释放]
@Richard
autorelease
使对象归顶级自动释放池所有,在控件离开当前方法之前,该池不会被清空。不过,这里有一个问题-
init
运行后,
bug
中的对象不属于此
BugThread
。Vivin,你不应该向那个对象发送
autorelease
,它不属于这里。你能更好地解释最后一部分吗?什么意思是
bug
不属于
BugThread
?很抱歉,这里几乎是Objective-C新手。这是基本知识:如果你需要一个对象生存,你可以通过
alloc
copy
创建它,或者保留它来获得所有权。当您不再需要该对象时,必须放弃所有权。当对象传递给方法时,您并不拥有它。如果您不拥有对象,则不得向其发送
release
(包括通过
autorelease
)。
NSOperation
NSOperationQueue
是否使多线程处理更容易,我是在GNUStep上而不是在OS X上这样做的。在GNUStep下似乎不支持NSOperation和NSOperationQueue。我似乎找不到它的任何文档!啊,对。我以为你在用可可粉。恐怕我对GNUStep了解不多,但是是的,
NSOperation
确实使多线程处理变得更容易。但是,不熟悉GNUStep,您可能还想了解GCD。@endy:这是一个很好的观点!是开源的,尽管我不确定它在其他操作系统上是如何工作的。
NSOperation
NSOperationQueue
是否使多线程更容易?另一方面,我是在GNUStep上做的,而不是在OS X上。似乎GNUStep下可能不支持NSOperation和NSOperationQueue。我似乎找不到它的任何文档!啊,对。我以为你在用可可粉。恐怕我对GNUStep了解不多,但是是的,
NSOperation
确实使多线程处理变得更容易。但是,不熟悉GNUStep,您可能还想了解GCD。@endy:这是一个很好的观点!是开源的,尽管我不确定它在其他操作系统上是如何工作的。