2

facebook-ios-sdkでメモリリークを修正しようとしたときに、この問題が発生しました。アークコンパイルされていないクラスからアーク対応クラスにオブジェクトを渡すときに、この状況をどのように処理しますか?

これは、アークコンパイルされていないFacebookライブラリ内のコードです:(問題に関係のない不要なものを削除しました)ご覧のとおり、結果オブジェクトは自動リリースまたはリリースされません。

- (void)handleResponseData:(NSData *)data {        
    NSError* error = nil;
    id result = [self parseJsonResponse:data error:&error];
    self.error = error;

    // Call the defined delegate wich is my AppDelegate didLoad method wich is arc enabled
    [_delegate request:self didLoad:result];
}

- (id)parseJsonResponse:(NSData *)data error:(NSError **)error {
    SBJSON *jsonParser = [[SBJSON alloc] init];

    //gets the object wich leaks or gets overreleased
    id result = [jsonParser objectWithString:responseString];
    [jsonParser release];

    return result;
}

結果オブジェクトに自動リリースを追加しようとすると、AppDelegateのアークコードがオブジェクトをリリースしようとしたときにNSZombieに直面しています。ただし、このようなコードを残すと、結果オブジェクトが解放されないときにメモリリークが発生します。

私は何か基本的なものが欠けていますか?私はこれに頭を悩ませることができませんか?

アドバイスありがとうございます!クリス

4

1 に答える 1

2

resultから返されたものは-parseJsonResponse:... すでに自動解放されています(下部の注を参照)。

メソッドの名前は-parseJsonnew、alloc、copy、またはmutableCopyで始まらないため、コンパイラーは、参照カウントが+0のオブジェクトを返すと想定します。つまり、オブジェクトを保持する場合は、呼び出し元のコードで保持する必要があります。周りにあり、それが維持されていない場合は解放する必要はありません。これは、質問に書かれているように、ARCコードがリークしたりクラッシュしたりしてはならないという長い言い方です。

ARCコードと手動参照カウントコードの間でオブジェクトを渡す場合、特別な処理は必要ありません。メソッドの名前が非ARCコードのメモリ管理セマンティクスと一致することを確認する必要があります。あなたが言うように、あなたはあなたの完全なコードを投稿しなかったけれども、あなたがこの場合それをしたように確かに思われる。

注:おそらく、objectWithString:自動解放されたオブジェクトを返します。そうでない場合は、そうする必要があります(alloc、new、copy、mutableCopyで始まらないため)。

于 2012-05-18T14:54:47.027 に答える