2012-02-03 66 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