我不确定我是否在这里造成泄漏,是否可以将分配的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;
}
答案 0 :(得分:1)
一般情况下,如果您传递给它的选择器以performSelector:
,alloc
,new
,retain
开头,则ARC中的copy
只能导致泄露,或mutableCopy
。
答案 1 :(得分:0)
可以通过执行选择器将分配的NSError返回给调用方法吗?
创建NSMutableArray并将其存储在同一对象中是否可以 我得到了回调?
然后将其传递给代表?
回答所有问题都没关系,没有任何问题。所有对象都以自动释放的方式创建。
答案 2 :(得分:0)
只要您通过performSelector:withObject:
调用的方法的返回值是一个对象,就可以这样做。
由于ARC将负责发布array
并且error
已自动释放,因此不会泄漏。
答案 3 :(得分:0)
一般情况下,避开performSelector:
。原因是ARC无法帮助你。即使您认为您的应用程序正常运行并且您已经测试过它,但是当您更改某些内容时,它可能会在稍后的行中发生。
当然,如果您正在调用的选择器不是以alloc
,new
,copy
,mutableCopy
等开头,那么它就不会有问题。但是有一些情况,例如使用__attribute__((ns_returns_retained))
使得方法可能会返回保留的内容并不明显。无论如何,拥有ARC无法帮助你的代码是一件坏事。
总有一种方法可以让您不必使用performSelector:
。为什么不使用回调块?例如?