UIGraphicsGetImageFromCurrentImageContext 预览内存泄漏

2023-12-30

我正在尝试创建 PDF 页面的预览图像 但我在释放内存方面遇到了一些问题。

我写了一个简单的测试算法来循环解决这个问题,应用程序在第 40 次迭代附近崩溃:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:@"myPdf.pdf"];
CFURLRef url = CFURLCreateWithFileSystemPath( NULL, (CFStringRef)pdfPath, kCFURLPOSIXPathStyle, NO );
CGPDFDocumentRef myPdf = CGPDFDocumentCreateWithURL( url );
CFRelease (url);
CGPDFPageRef page = CGPDFDocumentGetPage( myPdf, 1 );

int i=0;
while(i < 1000){

    UIGraphicsBeginImageContext(CGSizeMake(768,1024));
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0);
    CGContextFillRect(context,CGRectMake(0, 0, 768, 1024));
    CGContextSaveGState(context);
    CGContextTranslateCTM(context, 0.0, 1024);
    CGContextScaleCTM(context, 1.0, -1.0);
    CGContextDrawPDFPage(context, page);
    CGContextRestoreGState(context);

    // --------------------------
    // The problem is here (without this line the application doesn't crash)
    UIImageView *backgroundImageView1 = [[UIImageView alloc] initWithImage:UIGraphicsGetImageFromCurrentImageContext()];
    // --------------------------

    UIGraphicsEndImageContext();
    [backgroundImageView1 release];

    NSLog(@"Loop: %d", i++);
}

CGPDFDocumentRelease(myPdf);

上述行似乎会产生内存泄漏, 然而,仪器没有表现出记忆问题;

我可以避免这种错误吗?有人可以用哪种方式解释我? 还有其他方法可以显示 pdf 预览吗?

UPDATE

我认为问题不在于发布UIImage通过方法创建的UIGraphicsGetImageFromCurrentImageContext()但释放UIImageView使用此自动发布图像创建。

我将这行代码分为三步:

UIImage *myImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageView *myImageView = [[UIImageView alloc] init];
[myImageView setImage: myImage]; // Memory Leak

第一行和第二行不会造成内存泄漏,因此我认为 UIGraphicsGetImageFromCurrentImageContext 方法不是问题。

我也尝试了以下方法,但问题仍然存在:

UIImageView *myImageView = [[UIImageView alloc] initWithImage:myImage];

我认为在释放包含具有 autorelease 属性的 UIImage 的 UIImageView 时存在内存泄漏。

我尝试编写继承 UIView 的对象 UIImageView,如此处所述thread https://stackoverflow.com/questions/4644912/iphone-uiimageview-setimage-leaks.

这个解决方案有效,但不是很优雅,它是一种解决方法,我更喜欢使用对象 UIImageView 解决内存问题。


问题是这样的:

UIGraphicsGetImageFromCurrentImageContext()

返回一个自动释放的UIImage。自动释放池会保留该映像,直到您的代码将控制权返回给运行循环,而您很长一段时间都不会这样做。要解决这个问题,您必须在每次迭代(或每隔几次迭代)时创建并耗尽一个新的自动释放池。while loop.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIGraphicsGetImageFromCurrentImageContext 预览内存泄漏 的相关文章

  • Draggable UIView 在添加到 UIScrollView 后停止发布 TouchBegan

    在 Xcode 5 1 中我创建了一个简单的测试应用程序 https github com afarber ios newbie tree master ScrollContent对于 iPhone 结构是 scrollView gt co
  • 有没有办法更改 UITabBar 或 UITabBarItem 中的文本位置?

    这是我打算放在屏幕上的自定义选项卡栏 然而 我的搭档希望文字稍微向上一些 我怎样才能这样做呢 为什么不为视图控制器设置一个空的标题属性 并将标题添加到选项卡的自定义图像中 UPDATE 为了回答的完整性 来自评论和ios标签栏在没有图像时将
  • 将 UIDatePicker 装入 UIActionSheet 中

    我正在尝试让带有 UIButton 的 UIDatePicker 显示在 UIActionSheet 中 不幸的是 它被剪掉了 整个日期选择器都不可见 我什至还没有尝试添加 UIButton 谁能建议让整个视图正确配合 我不确定如何添加正确
  • didChangeCameraPosition 获取可用坐标的边界框/矩形

    如何从 GMSCameraPosition 检索 GMSColinedBounds 我想知道每次用户移动相机时地图上的可见坐标 至少东北 西南点 如下所示 void mapView GMSMapView mapView didChangeC
  • 有关 UnsafeMutablePointer 的 destroy() 的术语

    Destroy the object the pointer points to Precondition the memory is initialized Postcondition the value has been destroy
  • 如何更改故事板的初始视图控制器?

    我有2个视图控制器 我禁用了第一个视图控制器的初始视图控制器 并启用了第二个视图控制器 但是当启动项目时 初始视图控制器仍然是第一个视图控制器 我该怎么办 谢谢 点击第二个视图控制器 然后选择 Is initial View Control
  • 如何通过单击颤动推送通知来打开特定屏幕

    我试图在单击推送通知时打开特定屏幕 我的有效负载如下所示 var payload notification title notificationTitle body notificationMessage click action scre
  • 填充 UIScrollView 的垂直空间

    我正在研究一个具有UIScrollView 我想要做的是将标签固定在可滚动区域的顶部 并将按钮固定在底部 两者之间的空间最小 这个想法是 如果标签的高度增加 按钮将被向下推 以便用户必须向下滚动才能找到它 但是 如果标签很短 则标签和按钮之
  • 找不到 -lAFNetworking Xcode 问题的库

    ld warning directory not found for option L Users kh Library Developer Xcode DerivedData om euxqzibzllbcmndwqrgthdeotiro
  • 如何使用所有类型的 UTI 初始化 UIDocumentPickerViewController

    我想打开 UIDocumentPickerViewController 并且它应该允许用户选择所有类型的文件 我尝试在 UIDocumentPickerViewController init 方法中提及所有 UTI 但仍然找不到某些文件 如
  • 获取 UIView 的视图控制器(iphone)

    我这样做是为了获得视图 self superview viewWithTag 10 但我怎样才能获得该视图的视图控制器 就像您可以获得视图控制器的视图一样 我想采用另一种方式 以便我可以向该视图控制器发送消息 调用方法 例如 self su
  • 清除通过在 IPython 中绘图分配的内存

    我正在 IPython QtConsole 和 Notebook 中绘制一些大图 这些占用了大量的内存 但是一旦它们被绘制出来 我就不再需要它们了 它们就可以走了 我怎样才能释放内存 None以下作品 close clf cla reset
  • 如何确定当前处于活动状态的视图控制器/显示视图的视图控制器?

    在我的应用程序中 我正在排队一些本地通知 当它们触发时我必须呈现模式视图 问题是我有许多视图控制器 其中任何一个当前都可能处于活动状态 因此需要呈现模式视图控制器 如何确定当前正在使用哪一个 我将导航控制器设置为 Windows 根视图控制
  • EKEvent接受邀请

    你如何接受EKEventiOS 中的邀请 我知道这有可能梦幻般的 日历 5和其他日历应用程序具有此功能 但我没有看到公开的非只读属性来更改用户有关事件的状态 知道如何做到这一点吗 Thanks 事实证明 经过更多研究后 所有这些应用程序都只
  • 验证 iOS 应用程序时出现 com.apple.developer.linked-domains 问题

    当我在 Xcode 中使用 Organizer 验证我的项目时 出现以下错误 无效的代码签名权利 你的申请包的签名包含代码签名权利iOS 上不支持的 具体来说 值 for key com apple developer associated
  • 无法创建本机类型“NSObject”的实例

    我在执行下面的代码时遇到此错误 未能创建本机类型的实例 NSObject 可以通过将 Class ThrowOnInitFailure 设置为 false 来忽略此情况 var alert new UIAlertView Error Som
  • 是否可以使用 UITableViewStylePlain 禁用 UITableView 中的浮动标题?

    我正在使用一个UITableView布局内容 页面 我使用表视图的标题来布局某些图像等 如果它们不浮动而是保持静态 就像样式设置为时那样 我更喜欢它UITableViewStyleGrouped 其他则使用UITableViewStyleG
  • Objective c,实例成员的内存管理

    我对实例成员的内存管理感到困惑 我有一个带有 ivar 的课程 DetailedResultsTableViewController detailedResultsTableViewController and property nonat
  • 在哪里可以了解有关 WebCoreSharedBufferData 的更多信息?

    我有一个在 iOS 6 上完美运行的应用程序 但在 iOS 7 上 如果用户采取了非常具体的操作 太复杂而无法进入 但它使用UIWebView并且它是一致的 应用程序崩溃并出现错误 Terminating app due to uncaug
  • 更改 UIActionSheet 标题字符串的字体类型和大小

    我有一个带有标题字符串 DO 这些任务 的 UIActionSheet 在标题字符串中 子字符串 DO 应为粗体 具有特定字体大小 子字符串 这些任务 应为常规 是否可以 我怎样才能做到这一点 我假设你有一个类实现了UIActionShee

随机推荐