2010-12-10 58 views
0

我需要理解爲什麼在這段代碼中,如果我使用self.ws_data將值賦給ws_data變量,而不是如果我只使用ws_data,那麼我會得到內存泄漏。爲什麼用「self」設置值會導致內存泄漏?

self.ws_data是一個@property(副本)NSString *,在dealloc上發佈。

dispatch_queue_t ws_queue = dispatch_queue_create("ws check win", NULL); 
dispatch_async(ws_queue, ^{ 
    self.ws_data = [[NSString alloc]initWithContentsOfURL:url]; 
}); 
dispatch_release(ws_queue); 

謝謝!

回答

2

self.variableName通過訪問器訪問變量。由於您的ws_data NSString在其屬性聲明中設置爲,因此將複製,該字符串在您通過該聲明進行設置時保留。

不使用自我。引用伊娃而不通過那些訪問者。這也意味着該變量不會被複制,所以當對它的引用消失時(例如在方法結束時)它就會消失。

賠率是你想要的副本。你只需要在你完成時釋放它,就像你在dealloc中做的那樣。

您是否將它保留在其他地方,使其成爲第二次保留?

+0

不,我不保留它在任何地方。 – MatterGoal 2010-12-10 21:21:25

1

如果我正確地理解了事情(而且我很可能不這樣做,因爲我在這個實例中沒有進行過iOS開發),因爲你在屬性上使用了copy屬性,你當你使用self.ws_data時,你會這樣做,它正在有效地調用已經被分配的NSString的複製方法,NSString會創建一個保留數爲1的單獨的NSString實例。

但是,最初的NSString(這是在你的上面的示例中被分配)不會在任何時候被釋放,因此泄漏。

您可以使用...

self.ws_data = [[[NSString alloc]initWithContentsOfURL:url] autorelease]; 

...相反,我還以爲。