ARC:从performSelector调用的方法返回已分配的对象,可以吗?

时间:2013-01-27 08:44:11

标签: ios objective-c automatic-ref-counting performselector

我不确定我是否在这里造成泄漏,是否可以将分配的NSError返回给 执行选择器的调用方法? 是否可以创建NSMutableArray并将其存储在我为回调获得的同一个对象中?然后将它传递给代表? 代码工作正常,但因为我是新手,我害怕做错事。

(我正在使用执行选择器,因为我的选择器是动态的。仅仅是我静态编写的例子)。

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 个答案:

答案 0 :(得分:1)

一般情况下,如果您传递给它的选择器以performSelector:allocnewretain开头,则ARC中的copy只能导致泄露,或mutableCopy

答案 1 :(得分:0)

  

可以通过执行选择器将分配的NSError返回给调用方法吗?

     

创建NSMutableArray并将其存储在同一对象中是否可以   我得到了回调?

     

然后将其传递给代表?

回答所有问题都没关系,没有任何问题。所有对象都以自动释放的方式创建。

答案 2 :(得分:0)

只要您通过performSelector:withObject:调用的方法的返回值是一个对象,就可以这样做。

由于ARC将负责发布array并且error已自动释放,因此不会泄漏。

答案 3 :(得分:0)

一般情况下,避开performSelector:。原因是ARC无法帮助你。即使您认为您的应用程序正常运行并且您已经测试过它,但是当您更改某些内容时,它可能会在稍后的行中发生。

当然,如果您正在调用的选择器不是以allocnewcopymutableCopy等开头,那么它就不会有问题。但是有一些情况,例如使用__attribute__((ns_returns_retained))使得方法可能会返回保留的内容并不明显。无论如何,拥有ARC无法帮助你的代码是一件坏事。

总有一种方法可以让您不必使用performSelector:。为什么不使用回调块?例如?