2

iPhoneで小さなコードを実行しているとうまくいきません。

基本的に、ボタンを押すだけで、 が呼び出され、バックグラウンド スレッドでメソッドがrunTest実行されます。testそのため、自動解放プールを作成しました。

以下のコードを実行すると、コンソールに次のような美しいメッセージが表示されます。
2010-09-07 11:45:15.527 test[1312:207] *** -[CFString release]: message sent to deallocated instance 0x3d52ba0

-(void) test {
    NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];

    NSString *xml = [[NSString alloc] initWithFormat:@"<%@>", @"msg"];
    NSLog(@"%@\n",xml);
    [xml release];

    [apool release]; // <-- this line throws the error msg  
}

- (IBAction) runTest: (id)sender
{
    [self performSelectorInBackground:@selector(test) withObject:nil];

}

testバックグラウンド スレッド (自動解放プールなし) で実行せず、 を呼び出すだけ[self test]で、コードは正常に 動作することがわかりました。

だから、問題はスレッド+自動解放プールにあると思いますが、何が間違っていますか? どうすれば解決できますか?

PS私はNSZombieフラグを有効にしています。

4

3 に答える 3

0

NSLogは、コンソールにシリアル化されて印刷するためにUIスレッド(メインスレッドでセレクターを実行)にメッセージを送信する必要がある場合があります。その時点で、xmlは既に解放されています。

于 2010-09-08T17:33:53.377 に答える
0

代わり-autoreleaseにオブジェクトを試着しましたか? xmlこれにより、アクティブ プール に追加されますapool。宣言drainは宣言よりも優れ-releaseています。ガベージ コレクションのない環境では同じですが、いつか Apple が iPhone にガベージ コレクションを実装するかもしれません。お役に立てれば。

于 2010-12-15T09:57:40.490 に答える
0

この場合は問題になりませんが、常にdrainプールする必要があり、決してプールしないreleaseでください。

それがすべてのコードである場合、これは本当に奇妙なエラーです。

最初に提案したいのは、Instruments ですべての保持/解放イベントを記録しながら、ゾンビ検出を有効にしてコードを実行することです。これにより、問題のあるオブジェクトの保持/解放のインベントリが得られます。それでも意味がない場合は、結果を投稿してください。

于 2010-09-08T18:00:55.447 に答える