2011-03-29 105 views
0

我的一个自定义类有NSThread *作为成员变量。(iphone)是一个坏主意?

我让线程退出通过设置一个变量(isNeedToExit)。
然后在线程对象[myThread release]上调用释放;

我希望线程先退出并释放调用被调用。
但第二个想法是,释放调用可能会在线程发现布尔值已更改并退出之前被调用。
(因为线程并不经常看值是否需要退出)

@property(nonatomic,retain)NSThread * myThread;

- (void) dealloc 
{ 
    ... 
    [myThread release]; 
    myThread = nil; 
    ... 
    [super dealloc]; 
} 

- (id) initMyClass 
{ 
    if(self = [super init]) 
    { 
     ... 
     NSThread* aThread = [[NSThread alloc] initWithTarget: self selector:@selector(theThreadMain) object: nil]; 
     self.myThread = aThread; 
     [aThread release]; 
     [self.myThread start]; 
     .. 
    } 
    return self; 
} 

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

    // Add your sources or timers to the run loop and do any other setup.                                         
    NSRunLoop *runloop = [NSRunLoop currentRunLoop]; 
    [runloop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode]; 

    do 
    { 
     // Start the run loop but return after each source is handled.                                          
     SInt32 result = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 10, YES); 

    } 
    while (self.isNeedToExit == false); 

    [pool release]; 

    SYSLOG(LOG_DEBUG, "thread exiting"); 
} 

我想移动[MyThread的版本]调用(现在在类的dealloc的),以theThreadMain的最后一行..

不知道这是正确的方式来停止一个线程时,它是一个另一个类的成员变量。

谢谢

回答

1

其实,你最初的假设是更正确的。但是,您目前的实施将无法执行,因为dealloc将永远不会被调用。

您的课程由NSThread保留在initWithTarget:selector:object中,直到线程执行完毕才会被释放。因此,只要线程正在执行,您的类实例就不会被释放。

解决此问题的一种方法是向类中添加一个“取消”方法,以停止线程。例如:

- (void)cancel 
{ 
    isNeedToExit = YES; 
    [myThread release]; 
    myThread = nil; 
} 

这将导致线程停止,并让你的类被释放(一旦线程停止。)你需要确保你的类的所有用户都知道,“取消”需要被调用在课程发布之前。例如:

[myObject cancel]; // Stop the thread 
[myObject release]; 
myObject = nil; 

更传统的解决方案是将NSThread简单化。

+0

感谢您的回复,如果我正确理解您的话,我目前的实施(上面列出的代码)很好。由于基本上我所做的是,“myObject.isNeedToExit = YES; [myObject release];” ,并且当线程通过isNeedToExit标志完成时,它将再次释放myObject并调用dealloc。最终会调用[myThread发布]。你怎么看? – eugene 2011-04-01 07:15:57

相关问题