2009-11-08 80 views
0

NSURLConnection的*連接是類NSURLConnection泄漏 - 爲什麼?

@property (nonatomic, retain) NSURLConnection *connection; 

儀器正在報告我在下面的代碼的第二行泄漏的NSURLConnection的對象的屬性。

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url]; 
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
[request release]; 

didFinishLoadingdidFinishWithError代表選擇,我釋放連接並設置爲零

[self.connection release]; 
self.connection = nil; 

我讀過的"NSURLConnection leak?"後和其他幾個人。我覺得我必須錯過一些完全明顯的東西。幫幫我?

+0

由於您的財產被保留,您爲什麼不在分配給該財產後立即釋放連接? – falstro 2009-11-08 20:10:40

回答

3

由於從ROE的評論說,你分配的連接(保留計數1),然後用您的連接屬性(保留計數2)再保留它。您只能在代理選擇器中釋放一次。你有兩個選擇:

1)更改連接屬性來分配,而不是保留。

@property (nonatomic, assign) NSURLConnection *connection; 

// OR, since assign is the default you may omit it 

@property (nonatomic) NSURLConnection *connection; 

2)釋放分配的對象時,它是由你的連接屬性保留後:

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:_url]; 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
self.connection = connection; 
[connection release]; 
[request release]; 

選項2優選的,因爲有較少機會的泄漏,因爲alloc和發行版本中存在併攏儘可能。另外,如果您忘記釋放之前的連接,則合成的方法將爲您釋放前一個連接。不要忘記在dealloc中釋放self.connection。

+0

非常感謝! – TomH 2010-01-14 14:42:18

+0

哎呀,我的意思是說「正如魚子說的。」樂意效勞。 – 2010-01-15 03:12:30