自動解放プールが設定されていない場合のシナリオをキャッチしようとしています。
これは私のテストアプリです。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[self performSelectorInBackground:@selector(bgOperation:) withObject:nil];
}
- (void)bgOperation:(id)obj
{
NSString *string [[[NSString alloc] init] autorelease];
}
ブレークポイントobjc_autoreleaseNoPoolを設定してみました。
Instruments/Leaksでプロファイリングを試しました。
OSX 10.7.5 XCode 4.3.3ターゲティング10.6、AutomaticRefCounting = NO、GarbageCollection=サポートされていません。
NSApplicationには独自の自動リリースプールが含まれていることを理解しています。しかし、私の理解では、performSelectorInBackground:を呼び出すたびに、独自の自動解放プールが必要でした。
提案からの更新:
私はこれを試しまし
た..main.mで、運がありません。
int main(int argc, char *argv[])
{
NSString *junk = [[[NSString alloc]init]autorelease];
return NSApplicationMain(argc, (const char **)argv);
}
そしてこれ..
私のappDelegateでも、結果はありません。
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
[NSThread detachNewThreadSelector:@selector(bgOperation:)
toTarget:self
withObject:nil];
}
そしてこれ..
私のmain.mにpthreadを使用
void *doJunk(void *ptr){
NSString *junk = [[[NSString alloc]initWithString:@"string with no pool"]autorelease];
NSLog(@"%@", junk);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t thread;
pthread_create(&thread, NULL, doJunk, NULL);
return NSApplicationMain(argc, (const char **)argv);
}
OSレベルが原因で、リークが発生していない可能性があることは理解しています(まだ確認されていません)が、10.6をターゲットにすると、ログに「プールなし」というメッセージが多数表示されます。OSレベルが原因でリークするだけの場合は、10.6をターゲットにしているが10.7 SDKを使用しているときに、10.7でこれらのシナリオをキャッチする方法が必要です。