【发布时间】:2009-12-08 17:25:06
【问题描述】:
我有一个派生自 NSThread 的类:
@interface FSEventMonitorThread : NSThread {
FSEventStreamRef m_fseStreamRef;
CFRunLoopRef m_runLoop;
}
- (id) initWithStream:
(FSEventStreamRef)fseStreamRef;
- (void) dealloc;
- (void) main;
@end
@implementation FSEventMonitorThread
- (id) initWithStream:
(FSEventStreamRef)fseStreamRef
{
if ( self = [super init] )
m_fseStreamRef = fseStreamRef;
return self;
}
- (void) dealloc
{
CFRunLoopStop( m_runLoop );
FSEventStreamStop( m_fseStreamRef );
[super dealloc];
}
- (void) main
{
m_runLoop = CFRunLoopGetCurrent();
FSEventStreamScheduleWithRunLoop(
m_fseStreamRef, m_runLoop, kCFRunLoopDefaultMode
);
FSEventStreamStart( m_fseStreamRef );
CFRunLoopRun();
}
@end
在其他地方(在 C++ 函数内),我创建了一个实例:
m_thread = [[FSEventMonitorThread alloc] initWithStream:m_fseStreamRef];
我的理解是,retain-count 现在应该是 1。 在另一个 C++ 函数中,我想停止并释放线程:
[m_thread release];
然而dealloc 方法没有被调用。如果我改为这样做:
[m_thread release];
[m_thread release];
然后 dealloc 被调用,这意味着保留计数为 2。但它是如何变为 2 的?
请注意,NSThread 的文档仅提及使用 detachNewThreadSelector:toTarget:withObject: 时的保留。
【问题讨论】:
标签: objective-c cocoa release nsthread retain