2

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

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

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

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

可以创建 NSMutableArray 并将其存储在我为回调获得的同一个对象中吗?

然后将其传递给代表?

所有问题的答案都可以,没有任何问题。所有对象都是以自动释放方式创建的。

于 2013-01-27T08:56:13.997 回答
0

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

它不会泄漏,因为 ARC 会负责释放arrayerror自动释放。

于 2013-01-27T08:56:29.753 回答
0

一般来说,避开performSelector:. 原因是 ARC 无法帮助您。即使您认为您的应用程序有效并且您已经对其进行了测试,但当您更改某些内容时,它也可能会中断。

当然,如果您调用的选择器不以alloc, new, copy,mutableCopy等开头,那么它不会有问题。但是在某些情况下,例如使用__attribute__((ns_returns_retained))它会使方法可能返回保留的东西变得不明显。无论如何,拥有 ARC 无法帮助您的代码是一件坏事。

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

于 2013-01-27T10:55:19.497 回答