2011-03-07 17 views
1

首先看的retainCount有點慌亂這些代碼:一直有關於NSURLConnection的

NSURL *url = [[NSURL alloc] initWithString:@"lasdhfkjasf"]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
NSLog(@"aaaaaaaaa %d", [_conn retainCount]); 
[url release]; 
[request release]; 
[_conn release]; 

原來它打印「aaaaaaaaaaaaa 2」,它不應該是1或有某種異常了呢? there.Then我改變它:

NSURL *url = [[NSURL alloc] initWithString:@"lasdhfkjasf"]; 
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 
NSURLConnection *_conn = [[NSURLConnection alloc] init]; 
NSLog(@"aaaaaaaaa %d", [_conn retainCount]); 
[url release]; 
[request release]; 
[_conn release]; 

我不知道發生在initWithRequest:代表:方法,有沒有人知道這件事?

+0

可能重複[目標C的NSString *財產保留計數怪胎(http://stackoverflow.com/questions/403112/objective-c-nsstring-property:當值編譯期間知道這樣做是-retain-count-oddity) – 2011-03-07 14:39:47

回答

4

這裏的一切都完全可以:NSURLConnection必須保留自己以確保它可以將數據傳遞給委託(並且這樣做一定不能解除分配)。如果沒有委託,那麼沒有人會聽那個連接,並且沒有理由執行任何事情,所以它不保留自己。連接然後釋放本身後:

-(void) connectionDidFinishLoading:(NSURLConnection*) connection 

OR

-(void) connection:(NSURLConnection*) connection didFailWithError:(NSError*) error 

從你的例子:

. . . 
NSURLConnection *_conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
. . . 
[_conn release]; 

如果retainCount是1,那麼[_conn release]後的對象將被立即釋放,並會有根本沒有加載。

對於所有人,誰說retainCount工作不正確:你只是不知道它是如何工作的。至於NSString的「古怪」:這不是奇怪,這只是性能優化。 2147483647保留計數表示對象在內存中不變(並且在應用程序終止時被刪除)。

NSString* str = @"12345"; //has 2147483647 retain count. 
+0

所以你是那個會告訴我爲什麼'[NSNumber numberWithInt:1]'有一個retainCount爲7但是'[NSNumber numberWithInt:2]'有一個retainCount爲3,我可以做什麼此信息。 – 2011-03-07 15:19:43

+1

@fluchtpunkt出於與NSURLConnection相同的原因:您不知道在iOS內部調用了多少次[NSNumber numberWithInt:1]。沒有理由在內存中保存7個精確的NSNumber = 1副本,所以這個值只是保留。順便說一句:我在一個項目中的保留數是9,另一個是11 – Max 2011-03-07 15:23:21

+0

,這就是爲什麼retainCount信息完全無用。它可以具有任意值。例如[[NSNumber numberWithInt:100] retainCount]返回1證明我的想法(也許對你來說數字是不同的)[ – 2011-03-07 15:23:57

6

雖然不是技術上的問題重複尼古拉的聯繫,同樣的道理也適用:

不要用retainCount財產

這可能是蘋果公司有史以來投入NSObject的最糟糕的事情,因爲它的命名非常好,它讓你認爲它確實有用。

查看您之前關聯過的問題 - Objective C NSString* property retain count oddity - 但請查找第二個答案,即最高評分的答案。

+0

@lst謝謝你指出。有像這樣的許多問題(http://stackoverflow.com/questions/1206111 http://stackoverflow.com/questions/656902 http://stackoverflow.com/questions/1181010)。請在http://bugreport.apple.com/上提交錯誤信息,以便棄用retainCount或更新文檔。 – 2011-03-07 14:49:15

+0

@lst看到我的回答 – Max 2011-03-07 15:18:36