Obj-C自动释放网络请求在完成之前发布

时间:2012-02-03 21:54:33

标签: iphone objective-c memory-management autorelease

我有一个围绕网络请求构建的包装类。 我们称之为'WrapperNetworkRequest'

我包装它的原因是因为我回来后处理JSON响应。 然后使用'WrapperNetworkRequestDelegate'协议,将响应返回给委托。

我遇到的问题是,当使用'WrapperNetworkRequest'类作为自动释放的对象时,它会在网络请求完成之前自动释放。

我提出了我认为是一个可怕的想法([自我保留] + [自我释放]在适当的时间)

关于什么是处理这个问题的正确方法的任何想法/我做错了什么? 感谢

2 个答案:

答案 0 :(得分:2)

不要让WrapperNetworkRequest将自己保留在NSURLConnectionDelegate实施方法中,而是让其代理人拥有所有权。一种可行的方法:

@interface Foo : NSObject <WrapperNetworkRequestDelegate>
@property (nonatomic, retain) WrapperNetworkRequest * wrappedRequest;

@end

@implementation Foo
@synthesize wrappedRequest;

//....

- (void)bar
{
    WrapperNetworkRequest * request = [WrapperNetworkRequest aNewAutoreleasedRequest];
    request.delegate = self;
    self.wrappedRequest = request; // Foo instance assumes ownership

    [request goGetData];
}

//....

@end

答案 1 :(得分:0)

当您必须延长对象的生命周期时,保留self是一个完美的理念。你究竟是如何做到这一点的另一个问题是:你可以[self retain]或者你可以将self添加到共享的保留数组中,保留给定类型的所有对象。想想NSOperationQueue。将操作对象添加到队列后,可以安全地释放操作,因为通过将其添加到队列,您已将操作的所有权转移到队列中。