【问题标题】:Arc memory leaks and UIImage named iosArc 内存泄漏和 UIImage 命名为 ios
【发布时间】:2013-03-27 06:59:40
【问题描述】:

嗨,我基本上有两个问题

1) 在 ios6 xcode 4.2 ARC 环境中工作时是否仍需要处理内存泄漏,因为我知道 arc 只在作用域结束时调用。

2) 声明

self.profileImageView.image = [UIImage imageNamed:@"createProfile_addPhoto.png"];

它将图像放在内存中,这是屏幕的繁重过程。我在很多地方读过它,但没有找到任何替代代码来代替它。有没有更好的解决方案。

只是我需要处理内存问题。

【问题讨论】:

    标签: ios memory-management uiimageview automatic-ref-counting


    【解决方案1】:

    使用 imageWithContentsOfFile:

    代替 imageNamed
     NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"createProfile_addPhoto" ofType:@"png"];
    
     self.profileImageView.image =  [UIImage imageWithContentsOfFile:imagePath];
    

    【讨论】:

      【解决方案2】:

      我不知道我是否理解你的问题,但是:
      1-ARC 管理 Objective-C 对象的所有内存,在 iOS6 中还有 GCD 队列
      2-您使用的方法将图像缓存在内存中以供进一步调用。因此,如果您多次调用此图像是值得的(除非图像真的很大)。

      如果您需要创建更小的范围,您可以将代码嵌入到 @autorelease 块中,这在处理循环时很有用,但如果您使用 -imageNamed:,我告诉过您将缓存图像。更好地使用-imageWithContentsOfFile:
      ARC 中的泄漏几乎是不可能的,如果您正在处理 Core Foundation 不透明类型,就会发生泄漏,这些类型不是由 ARC 自动管理的。使用 ARC 可能发生的情况是废弃内存或保留周期,从未听说过使用它的泄漏。
      希望这可以帮助, 安德烈亚

      【讨论】:

        【解决方案3】:

        1) 是的,对于某些情况(即强参考周期)

        2) [UIImage imageWithContentsOfFile:] 可以代替你。 imageNamed: 实现了一个缓存系统。但是,当内存紧张时,它会自行清除。

        【讨论】:

          【解决方案4】:

          问题1):
          ARC 存在内存泄漏的另一种可能性是使用没有设置自动释放池的单独线程。苹果文档https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html:
          “您必须在线程开始执行后立即创建自己的自动释放池块;否则,您的应用程序将泄漏对象。”
          如果没有设置自动释放池,即使调用一个简单的getter方法也会造成内存泄漏,如果它返回一个自动释放对象。

          【讨论】:

            猜你喜欢
            • 2017-10-03
            • 2013-08-19
            • 2014-06-15
            • 2013-01-07
            • 2011-08-31
            • 1970-01-01
            • 1970-01-01
            • 2012-04-03
            • 1970-01-01
            相关资源
            最近更新 更多