【发布时间】:2014-04-06 02:43:37
【问题描述】:
我遇到了一个应用程序问题,每次推送到特定视图时内存都会继续增长。重新创建这种内存增加的过程是:
- 显示用户登录视图控制器
- 推送主页视图控制器
- 推送设置视图控制器
- 注销用户(设置视图控制器中的一个按钮) - 弹出到用户登录视图控制器
- 登录并推送主页视图控制器
每次我推送到主视图控制器时(即使我已经确认前一个控制器正在被释放),内存都会增加 6+mb。我对应用进行了分析,发现分配中的 VM:ImageIO_PNG_Data 和 VM:CoreAnimation 类别存在一个明显问题。
其中一些发生在我正在使用的名为 Masking View 的类中,该类在该视图下方绘制图层的指定部分。用于绘制的代码如下:
//Draw project image
CGRect newRect = self.frame;
if (useCustomFrame){
newRect = customFrame;
}
CGImageRef image = CGImageCreateWithImageInRect([self.projectedImage CGImage], newRect);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, image);
// Release Context
CGImageRelease(image);
【问题讨论】:
-
尝试释放上下文。 CGContextRelease(上下文);
-
释放上下文会导致错误,我认为是由于过度释放,因为这是 ARC:CGContextResetState: invalid context 0x9296780。这是一个严重的错误。此应用程序或它使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性的整体下降。此通知是出于礼貌:请解决此问题。这将成为即将到来的更新中的致命错误。
-
您想使用 Leaks 工具而不是 Allocations 来运行它。泄漏的最大事情也往往不是导致泄漏的事情。
-
我曾用 Leaks 对其进行过分析,之前希望能找到一些东西,但现在返回 0 个泄露的对象。这可能是最让我失望的事情。
-
问题可能不是泄漏,而只是废弃的内存。这意味着您仍然可以从某个地方对图像进行有效引用,但不再可以访问它。尝试在您的主视图控制器上进行一些世代分析(也称为堆分析) - developer.apple.com/library/ios/documentation/DeveloperTools/…
标签: ios objective-c xcode memory-management allocation