• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - @try-@finally 确保在处理未被 ARC 跟踪的对象时消除内存泄漏

[复制链接]
菜鸟教程小白 发表于 2022-12-13 15:28:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

假设我们使用 malloc()/calloc() 手动分配内存或分配一些未被 ARC 跟踪的对象(如 CGContextRef)。然后,我们正在做一些事情。最终,我们需要释放该内存。

例子:

void *buf = NULL;     // malloc() allocated object example
CGContextRef context; // Non-manageable by ARC object example

@try {
    buf = malloc(bufSize);
    context = CGBitmapContextCreate(buf, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaNone);

    // Some exception-prone stuff is going here
}
@catch (NSException *e) {
    // ...
}
@finally {
    CGContextRelease(context);
    free(buf);
}

在@try-@finally 中进行内存分配/取消分配是保证在“do stuff”部分抛出异常时释放它的最佳/正确/推荐方法吗?

如果不是,您能否建议一种更好的技术并解释为什么它更可取?



Best Answer-推荐答案


Is putting a memory allocation/de-allocation in a @try-@finally the best/proper/recommended approach to guarantee that it would be freed in case if exception is thrown in the "do stuff" section?

没有。

ObjC 异常应该总是会在不久的将来导致崩溃。从 @try 完全恢复是不好的 ObjC;最终你应该总是重新抛出异常以允许程序崩溃。您的问题实际上有点倒退,担心非ARC管理的对象。除非您编译为 ObjC++,否则 ARC 会在 ObjC 异常后故意像筛子一样泄漏。

正确的做法是消除异常。在 ObjC 中不应该有“一些容易发生异常的东西在这里发生”之类的东西。 ObjC 不是(也从未打算成为)异常安全的语言。当编译为 ObjC++ 时,需要完成额外的工作(以及额外的运行时开销)以尝试使其更安全,因为 C++ 异常很常见,但这不应被视为使用 @try 的理由>.

Clang's explanation of ARC with exceptions是该主题的出色入门读物。最有启发性的是本节(强调添加):

The standard Cocoa convention is that exceptions signal programmer error and are not intended to be recovered from. Making code exceptions-safe by default would impose severe runtime and code size penalties on code that typically does not actually care about exceptions safety. Therefore, ARC-generated code leaks by default on exceptions, which is just fine if the process is going to be immediately terminated anyway. Programs which do care about recovering from exceptions should enable the option.

还有Exception Programming Topics :

The Cocoa frameworks are generally not exception-safe. The general pattern is that exceptions are reserved for programmer error only, and the program catching such an exception should quit soon afterwards.

使用 @catch 的唯一原因是因为您想创建某种诊断程序来帮助您了解崩溃(正确地执行此操作是一个非常高级的主题,不适合微弱的人)心或新手)。它绝不是为了将您从编程错误中解救出来。

请注意,ObjC 的 @try 与 Swift 的 try 完全无关。 Swift 的 try 只是一个花哨/神奇的 return (它甚至不是其他语言中通常表示的“异常”)。

关于ios - @try-@finally 确保在处理未被 ARC 跟踪的对象时消除内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44659503/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap