簡體   English   中英

帶NSNumber框式表達式的內存分配之謎

[英]Memory Allocation Mystery with NSNumber boxed expression

我有一個計算一些值的類,並提供這些值的字典作為返回值。 字典在類的初始化中分配,並且每次算法運行時都會更新值。 return語句如下所示:

[self.retDict setObject:@(self.movmean) forKey:self.indexedKeys[0]];
[self.retDict setObject:@(self.movvar) forKey:self.indexedKeys[1]];
[self.retDict setObject:@(self.movstd) forKey:self.indexedKeys[2]];
...
[self.retDict setObject:@(0) forKey:self.indexedKeys[8]];
return self.retDict;

當我使用內存分配工具對我的應用進行配置文件時,我看到非常嚴重的泄漏可追溯到這些行。 深入研究調用樹,我可以看到框式表達式調用了[NSNumber number numberWithdouble:] (這很有意義...)和[NSPlaceholdernumber initWithDouble:] 依次調用CFNumbercreate ,似乎導致堆中CFNumber的數量似乎無限增長。

我想我的最終問題是,是否將NSNumber裝箱的表達式導致未發布的CFNumber? 還是我在上面的代碼中所做的其他事情會導致這種情況? 解決此問題的任何幫助將不勝感激。 我在代碼中經常使用帶框表達式,僅運行約10分鍾后,我的應用程序便累積了將近15MB的CFnumbers。

泄漏會告訴您泄漏對象的分配位置,而不是導致泄漏的動作。

如果您要循環執行此操作,則很可能是因為缺少耗盡自動釋放池的原因。 如果使用@autoreleasepool { ... lines ... }將以上@autoreleasepool { ... lines ... }@autoreleasepool { ... lines ... } ,則可能會解決此問題。

如果確實是泄漏,則問題出在其他地方。 在“分配工具”中啟用“跟蹤參考計數”(原文如此),這將向您顯示多余的保留來源。

在bbum使用@autoreleasepool{}提及之后,我做了一些研究並得出了答案。 我正在使用的應用程序是我使用多個線程的第一個應用程序。 我們使用主動對象體系結構將多個對象分派到它們自己的線程。 在活動對象的while循環內,我添加了一個@autoreleasepool {}(如下所示),我們所有的內存泄漏都消失了。

while(!shutdown)
 @autoreleasepool{
  //do a bunch of work
  }
 }

我很驚訝地發現,即使在ARC打開的情況下,當您分派新線程時,仍然需要手動創建自動釋放池。 我在網上看到的有關此問題的大多數答案都引用了iOS的較早版本,因此我想發布此內容並確認在iOS 7.1中仍然如此。

暫無
暫無

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

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