2012-11-26 25 views
2

我可以在applicationDidFinishLaunching:中使用異步請求創建NSURLConnection對象,並且不在實例變量中保留對它的引用,如下所示?需要引用NSURLConnection?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSURLConnection *localVariable = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
} 

我相信這應該工作時不使用ARC。雖然我不再提及NSURLConnection對象,但它應該完成它的工作,並且不會被釋放,直到我使用其中一個委託方法釋放該對象,如connectionDidFinishLoading:,因爲它將留下applicationDidFinishLaunching:保留計數爲+1,對吧?

但問題是:這是否被認爲是不好的風格?我應該總是用這種對象關係來維護一個實例變量嗎?我能做些什麼來使這項工作與ARC?畢竟,當localVariable超出範圍,ARC會釋放我的NSURLConnection,我想。

回答

4

我找不到這方面的官方參考資料,但似乎用initWithRequest創建的NSURLConnection對自己保持強烈的參考,以防止它被釋放。只有在最終委託功能被調用或連接被取消之後,纔會刪除該引用。

(參見例如been having a little confusion about the retainCount of NSURLConnectionhttp://www.cocoabuilder.com/archive/cocoa/110116-nsurlconnection-retaincount-at-initialisation.html

因此您的代碼還與ARC:即使localVariable超出範圍,另外還有一個參考連接,只要該連接是「活動的」。

這意味着你不要必須保持對連接的引用。但它很有用,因爲它可以使您在必要時取消連接。

+0

但是這也意味着我不應該真正依靠'NSURLConnection'來保留它自己,因爲它既不明顯也不正式記錄它會表現得那樣,對吧?爲了達到這個目的,NSURLConnection是做什麼的?它是否足以讓它在實例變量中保持對自身的強烈引用? (沒有ARC,它可以簡單地在'init'中調用'[self retain]',我想。) – tajmahal

+1

@tajmahal:我確定'NSURLConnection'的行爲與我描述的一樣(也來自我自己的實驗),但你是當然,沒有記錄,所以保持參考是安全的方式。 - 對於第二個問題:是的,唯一的方法是連接在實例變量中保留對自身的強引用。 –