我遇到了一个非常奇怪的问题,如果我单击xcode中的“运行”按钮,我的代码将按照我的想法运行
但是,在我将其存档后,将其安装在同一iPhone(4s,6.1.3)上
该块未按我的想法运行。
我正在使用旧的ASIHttpRequest API。
这是我项目中的代码
1.单例类处理api调用
APICall.h
typedef void (^CompleteHandler)(NSMutableArray *);
- (void)listAllHistoryData:(CompleteHandler)theBlock;
APICall.m
- (void)listAllHistoryData:(CompleteHandler)theBlock{
__weak ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:eWhereListAllDataURL];
request.delegate = self;
[request setRequestMethod:@"GET"];
[request setCompletionBlock:^{
NSString *response = [request responseString];
NSData *data = [response dataUsingEncoding: NSUTF8StringEncoding];
_sessionList = [[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil] objectForKey:@"all_sessions"];
theBlock(_sessionList);
}];
[request startAsynchronous];
}
2.视图控制器
- (void)viewDidLoad{
[[APICall shareInstance] listAllHistoryData:^ (NSMutableArray *list) {
dataList = [NSMutableArray arrayWithArray:list];
}
[theTableView reloadData];
}];
就像我发布这些代码一样...
归档项目后,看不到有什么不同。
无论如何,感谢您的任何回答或评论
韦伯
最佳答案
您的局部变量是__weak
ARC可以在分钟requestWithURL:...返回时将此引用移至该引用(返回递减保留计数,__ weak不会递增保留计数)。因此,在可以对其调用startAsynchronous之前,将释放您的请求变量并将其设置为nil。
为什么要使该局部变量__weak?删除代码时,不会涉及牢不可破的保留周期。我相信,完成块在被调用后将被淘汰(并释放/销毁)。
如果不是这种情况,并且这里确实有泄漏,则必须创建另一个对ASIFormDataRequest的非弱引用,以免在您的方法中被遗忘。
AdHoc版本不起作用的原因是AdHoc是使用Release目标构建的,该目标打开了优化功能(我相信会导致LLVM以更严格的方式通过ARC杀死您的对象)。
关于iphone - 块中的块不能在临时存档中调用,但可以通过xcode正常运行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17438483/