Объект класса NSThread автоматически освобожден без пула на месте - PullRequest
2 голосов
/ 12 февраля 2012

Я работаю над многопоточностью, используя следующие коды в XCode4:

#import <Foundation/Foundation.h>

bool trigger = false;
NSLock  *theLock=[NSLock new];

@interface Metronome : NSObject
+(void)tick:(id)param;
@end

@implementation Metronome
+(void)tick:(id)param{
while(1)
   {
           NSLog(@"TICK\n");
           usleep(1000000);
           [theLock lock];
           trigger = true;
           [theLock unlock];
   }
}
@end

int main()
{
    [NSThread detachNewThreadSelector:@selector(tick:)
toTarget:[Metronome class] withObject:nil];
}

Ошибка компиляции отсутствует, но во время выполнения в консоли появляется следующее предупреждение:

objc[688]: Object 0x100300ff0 of class NSThread autoreleased with no pool
in place - just leaking - break on objc_autoreleaseNoPool() to debug

Я не знаком с управлением памятью в obj-C.Может кто-то объяснить это мне?Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 12 февраля 2012

вам нужен пул потоков.

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

    //code that should be run in the new thread goes here

    [pool release];
}

Вы также можете рассмотреть возможность использования arc.http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

1 голос
/ 12 февраля 2012

Вы должны создать NSAutoreleasePool для каждого потока, который должен вызывать autorelease, включая основной поток

int main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [NSThread detachNewThreadSelector:@selector(tick:)
toTarget:[Metronome class] withObject:nil];
    [pool release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...