我遇到了一个非常奇怪的问题,如果我单击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/

10-12 00:42
查看更多