2012-02-03 79 views
1

我有一个围绕网络请求构建的包装类。 可以称之为'WrapperNetworkRequest'完成之前发布的Obj-C自动发布网络请求

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

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

我想出了什么,我认为这是一个可怕的想法([自我保留] + [自我释放]在适当的时候)

什么是处理这种有道任何想法/我在做什么错误? 谢谢

+0

首先,@sho提供了一个很好的解决方案,这通常是最好的方法。其次,'[自我保留]'历史悠久。你几乎不是第一个使用这种技术的人:D(我没有捍卫它,只是说我已经看过很多次了,并且使用了它几次)。第三,你可能想考虑一个像MKNetworkKit的框架,旨在处理这个问题(和相关问题)并自动管理自己的队列。你还可以看看它如何保持它的联系以获得灵感。 https://github.com/MugunthKumar/MKNetworkKit – 2012-02-03 23:41:27

回答

0

保留self是一个非常理智的想法时,你必须延长对象的生命周期。你如何做到这一点是另一回事:你可以做[self retain]或者你可以将self添加到共享的保留阵列中,保留给定类型的所有对象。认为NSOperationQueue。在将操作对象添加到队列后,可以放心地释放该操作,因为通过将操作对象的所有权转移到队列中将其添加到队列中。

+0

虽然@sho提供了部分解决我的问题的答案,但这似乎是我需要的解决方案。在阅读你的答案并做了一些研究之后,我发现一些文献建议NSURLConnection例如将其自身添加到运行循环中,该循环取得它的所有权直到它完成。这允许在想要将包装类用作局部变量的类中具有更大的灵活性。包装类将自己添加到拥有所有权的共享实例,直到包装完成似乎对我的情况更有意义。感谢大家的帮助 – SRandazzo 2012-02-04 19:28:48

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 
+0

谢谢。我已经考虑过这种方法,但我仍然想知道,如果我将这个包装课程交给朋友怎么办?我是否必须告诉他们,唯一能够得到答复的保证_italic_方法是保留它。 – SRandazzo 2012-02-03 22:16:24

+0

我一直在努力解决这个问题,我的解决方案与此处的解决方法相同 - 即您必须作为调用者确保对象保持在周围。如果你仔细想想,这也是有道理的。如果使用请求的对象不拥有它,那么它如何保证它会从它那里得到任何回报? – mattjgalloway 2012-02-03 22:23:17

+0

东西需要处理响应,对吗?处理程序(即委托人)接受所有权(即保留)请求似乎是适当的。 – sho 2012-02-03 22:25:32