2

ここでリークが発生したかどうかはわかりませんが、実行セレクターを使用して、割り当てられたNSErrorを呼び出し元のメソッドに戻しても大丈夫ですか?NSMutableArrayを作成し、コールバック用に取得したのと同じオブジェクトに保存しても大丈夫ですか?後でそれを代理人に渡しますか?コードは正常に機能しますが、私はarcを初めて使用するため、何か間違ったことをする恐れがあります。

(セレクターは動的であるため、performセレクターを使用しています。静的に記述した例だけです)。

AFHTTPRequestOperation *operation = [self.client HTTPRequestOperationWithRequest:request 
   success:^(AFHTTPRequestOperation *operation, id responseObject) {

        //-----------------Callback--------------------

        #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        SEL callback = @selector(getOperationCallback:);
        NSError *error = [self performSelector:callback withObject:operation];

        //------------------Delegate Call---------------
        if(operation.delegate)
            [operation.delegate onFinish:operation.requestIdentifier error:error 
                                                    data:operation.parsedObject];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

        //------------------Delegate Call---------------
        if(operation.delegate)
            [operation.delegate onFinish:operation.requestIdentifier error:error data:nil];

    }];

- (NSError *)getOperationCallback:(AFHTTPRequestOperation *)operation{

    NSArray *rawJson = (NSArray *)operation.jsonObject;
    NSError *error;

    NSMutableArray *array = [[NSMutableArray alloc] init];

    for(id json in rawJson){
        MyObject *object = [[MyObject alloc] initWithJson:json];
        if(object){
            [array addObject:object];
        }else{
            error = [NSError errorWithDomain:@"myErrors" code:1000 userInfo:nil];
            break;
        }
    }

    operation.parsedObject = array;

    return error;
}
4

4 に答える 4

1

通常、 ARC では、渡すセレクターが、、、、またはperformSelector:で始まる場合にのみ、リークが発生する可能性があります。allocnewretaincopymutableCopy

于 2013-01-27T10:44:02.527 に答える
0

一般に、 は避けてperformSelector:ください。その理由は、ARC があなたを助けることができないからです。アプリが動くと思っていて、それをテストしたとしても、後で何かを変更したときにうまく機能しなくなる可能性があります。

allocもちろん、呼び出しているセレクターが, new, copy,などで始まらmutableCopyない場合は問題ありません。ただし、それを使用__attribute__((ns_returns_retained))すると、メソッドが保持されたものを返す可能性があることが明らかでなくなる場合があります。いずれにせよ、ARC が役に立たないコードを持つことは悪いことです。

を使用する必要がないようにする方法は常にありますperformSelector:。たとえば、コールバック ブロックを利用してみませんか?

于 2013-01-27T10:55:19.497 に答える
0

割り当てられた NSError を、Perform Selector によって呼び出し元のメソッドに戻しても問題ありませんか?

NSMutableArray を作成して、コールバック用に取得した同じオブジェクトに格納してもよろしいですか?

後でデリゲートに渡しますか?

すべての質問への回答はOKです。何も問題はありません。すべてのオブジェクトは autorelease 方法で作成されます。

于 2013-01-27T08:56:13.997 に答える
0

呼び出しているメソッドの戻り値がperformSelector:withObject:オブジェクトである限り、それを行ってもまったく問題ありません。

ARC がリリースarrayを処理し、自動リリースされるため、リークすることはありませんerror

于 2013-01-27T08:56:29.753 に答える