菜鸟教程小白 发表于 2022-12-12 23:51:38

ios - 如何清除不指向自己代码的废弃内存?


                                            <p><p>似乎我的应用程序正在放弃内存,因为记录的堆的持久内存不会降至零,并且当连续重复同一组操作时堆继续增长:
<img src="/image/Fdbc9.png" alt="enter image description here"/> </p>
<p>为了找出问题,很多人建议<a href="http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/" rel="noreferrer noopener nofollow">Bill&#39;s site</a>这对我没有用,因为我使用的是 ARC,而他指出了引用问题。然后我关注了<a href="http://developer.apple.com/library/ios/#recipes/instruments_help-memory-allocations-help/Finding_Abandoned_Memory/07_Finding_Abandoned_Memory.html" rel="noreferrer noopener nofollow">Apple docs</a>并观看了一些与 WWDC 的废弃内存有关的视频。他们都说工具将有助于指出可能导致问题的代码行。所以我检查了每一个对象,但没有看到任何与我的代码相关的内容:</p>
<p> <img src="/image/E8q2q.png" alt="enter image description here"/> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我认为您需要明确查找保留周期。当在层次结构中,您有一个父对象对象,该对象具有相关对象并且都具有强类型的属性,它们永远不会从内存中释放。</p>

<p>快速示例:</p>

<pre><code>@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (strong) Parent *parent;
@end
</code></pre>

<p>默认情况下属性是强的,所以如果你根本不声明它也是一样的。</p>

<p>应该是这样的:</p>

<pre><code>@interface Parent : NSObject
@property (strong) Child *child;
@end
@interface Child : NSObject
@property (weak) Parent *parent;
@end
</code></pre>

<p>我还发现了 Instruments 可以向您显示保留周期的信息(而且看起来不错)。更多细节在这里<a href="https://stackoverflow.com/questions/8852451/how-to-activate-cycles-reporting-in-instruments-under-arc" rel="noreferrer noopener nofollow">How to activate Cycles reporting in Instruments under ARC?</a>但是我不知道它是否适用于 ARC,评论可能表明它不适用。作为一种繁琐的方式,我建议您注释掉一些您认为可能负责的代码,然后检查图片。 </p>

<hr/>

<p>这就是保留周期。您应该寻找的另一件事是当您分配 ARC 无法返回的内存时。这些调用看起来像 C 函数,并且按照惯例,名称中有一个单词 Create。每次你做出这样的指针时,你也应该自己清理。举几个例子:</p>

<ul>
<li>CGColorCreate - CGColorRelease </li>
<li>CGColorSpaceCreateWithName - CGColorSpaceRelease </li>
<li>CGBitmapContextCreate - CGContextRelease </li>
</ul>

<p>如您所见,每个函数都有其对应的发布函数,通常您应该能够在文档中找到。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何清除不指向自己代码的废弃内存?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/13580883/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/13580883/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何清除不指向自己代码的废弃内存?