我需要一個額外的線程在後臺偵聽來自套接字的請求。啓用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