我需要一个额外的线程在后台侦听来自套接字的请求。启用ARC的Threaded Obj-C代码 - 为什么它以这种方式工作?
该代码被放入单例类;它将在main.m文件被称为NSApplicationMain()这样的前:
而且runThread定义如下:
- (void) runThread {
[NSThread detachNewThreadSelector:@selector(socketThreadMainLoop:)
toTarget:self
withObject:[self quitLock]];
}
- (void) socketThreadMainLoop:(id)param {
NSLock *lock = (NSLock *)param;
while (![lock tryLock]) {
NSLog(@"Yay! We are in socketThreadMainLoop now!");
[NSThread sleepForTimeInterval:2];
}
NSLog(@"Terminating the socket thread...");
[lock unlock]; // is it really necessary?
}
它没有警告编译成功,但会抛出运行时错误:
autoreleased with no pool in place.
我做了一些谷歌搜索,试图runThread和socketThreadMainLoop将代码与@autoreleasepool,但错误依然存在。最后,我用main.m将调用包装到runThread中,并且工作正常!
我不知道为什么它只能这样......
它不起作用。相反,它会重复两次以下错误信息: ''objc [64204]:NSLock类的对象0x100118a00自动释放,没有就位 - 只是泄漏 - 在objc_autoreleaseNoPool()上进行调试以调试 objc [64204]:对象0x100108c20 class SKSocketThread autoreleased没有池 - 只是泄漏 - 打破objc_autoreleaseNoPool()调试 – wecing
我不知道是否因为我在线程中使用'self'和'quitLock'。 – wecing
咦?他正在使用ARC,而不是GC。因此,任何辅助线程(不直接使用运行循环)都非常需要@autoreleasepool {}。 – bbum