1

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

就像我发布这些代码一样......

归档项目后,我看不出有什么不同。

无论如何,感谢您的任何回答或评论

韦伯

4

2 回答 2

2

你的局部变量是 __weak

ARC 可以在 requestWithURL: ... 返回的那一刻对这个引用进行核对(返回会减少保留计数,__weak 不会增加它)。因此,在您调用 startAsynchronous 之前,您的请求变量将被释放并设置为 nil。

你为什么要创建局部变量__weak?删除代码时,代码中没有牢不可破的保留周期。我相信完成块在被调用后被取消(并释放/销毁)。

如果不是这种情况,并且您在这里有真正的泄漏,那么您将不得不创建另一个对 ASIFormDataRequest 的非弱引用,这样它就不会在您的方法中被吹走。

AdHoc 版本不起作用的原因是因为 AdHoc 是使用 Release 目标构建的,这会打开优化(我相信会导致 LLVM 以更严格的方式通过 ARC 杀死您的对象)。

于 2013-07-03T02:47:48.917 回答
0

__weak 请求在 Xcode 的发布模式下发布。您可以在目标 - 构建设置 - 调试和发布中的优化级别中找到这些差异。

在构建阶段设置以下附加“-O0”的类 - 编译源 ASIFormDataRequest.m ASIHTTPRequest.m 对我有用。

希望它可以帮助

于 2013-10-05T07:49:58.223 回答