簡體   English   中英

為什么用“ self”設置值會導致內存泄漏?

[英]Why setting value with “self” cause memory leak?

我需要了解為什么在此代碼中,如果我使用self.ws_data將ws_data變量賦值,而我僅使用ws_data而不賦值,則會發生內存泄漏。

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);

謝謝!

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

不使用自我。 無需通過那些訪問器即可引用ivar。 這也意味着該變量不會被復制,因此當對它的引用消失時(如方法末尾)它將消失。

您需要副本的可能性很大。 您只需要在完成操作后釋放它,就像在dealloc中一樣。

您是否將其保留在其他位置,從而使此訪問權限成為第二保留?

如果在這種情況下我理解正確(並且可能很長一段時間都沒有進行iOS開發),因為您在屬性上使用copy屬性,那么您在做什么時您使用self.ws_data可以有效地在已分配的NSString上調用copy方法,該方法將創建一個保留計數為1的NSString的單獨實例。

但是,原始的NSString(在上面的示例中分配的)在任何時候都不會釋放,因此會泄漏。

你可以用...

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

...相反,我原本以為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM