适用于Fire的iOS ARC最佳实践和忘记ASYNC Wrappers

时间:2015-03-18 22:06:36

标签: ios objective-c automatic-ref-counting

我有一个相当简单的NSURLConnectionDelegate包装器类,它处理我的应用程序的简单HTTP请求。

当这些请求返回时,它们会调用主视图控制器类中的后续委托方法,以通知我结果是否成功。

如果我采用一种即发即弃的方法在我的视图控制器中的方法中使用这些包装器,如下所示:

- (void) Foo {
    MySimpleRequest* request = [[MySimpleRequest alloc] initWithDelegate:self];
    [request send];
}

只要Foo退出,request似乎就会被ARC清除,后续的委托方法永远不会被调用。

如果我将request指针移动到类级别,它会挂起并成功。

这是推荐的方法吗?我是否必须使成员变量保持每个请求,或者有没有办法在请求返回之前保持其生命周期活着?

2 个答案:

答案 0 :(得分:2)

您可以使用块从下载中返回数据,并将下载程序类作为下载的委托,以便所有委托方法都可以包含在该类中。我使用一个处理NSURLConnection的类,并从didFailWithError或connectionDidFinishLoading:调用完成块。执行块后,将取消分配下载程序类。我从视图控制器这样调用它,

    Downloader *dl = [Downloader new];
    NSURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.wswd.net/testdownloadfiles/20MB.zip"]] cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:10];

    [dl downloadWithRequest:request completion:^(NSData *data, NSError *error) {
        if (data) {
            // do whatever you need to do with the raw data here
            NSLog(@"got the data");
        }else{
            NSLog(@"%@",error);
        }
    }];

答案 1 :(得分:1)

我希望始终保留对请求的“外部”引用。如果你不想这样,我想你可以在MySimpleRequest课程中创建一个强烈的自我引用。

确保将此值设置为nil或者显然会出现内存泄漏。