【问题标题】:Why releasing in constructor cause EXC_BAD_ACCESS?为什么在构造函数中释放会导致 EXC_BAD_ACCESS?
【发布时间】:2015-07-15 14:22:01
【问题描述】:

我有以下类构造函数

- (id)initForBlurringWithConstantMaskWithID:(int)maskid andSize:(CGSize)s{
self = [super init];
if (self) {
    // some code

    CGImageRef maskRef = [maskUI CGImage];

    //Some code where maskRef is used

    CGImageRelease(maskRef); // I won't ever use it again
}

return self;

}

但是,当使用 ARC(在我看来)释放对象时,一切都会因 EXC_BAD_ACCESS(代码=EXC_i386_GPFLT)而崩溃,这通常在访问“错误”地址时调用。

如果我删除发布行,一切正常。无论如何,谁能解释为什么会这样?

我的猜测是 ARC 也在尝试删除 maskRef,但找不到它并导致崩溃。

【问题讨论】:

    标签: objective-c constructor crash automatic-ref-counting release


    【解决方案1】:

    您只需在创建 (CGImageCreate)、复制或保留对象时调用 CGImageRelase。 [maskUI CGImage] 不要求新的所有权,因此您不负责释放它。

    解决方案: 放弃CGImageRelease(maskRef);

    https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CFTypeRef/index.html#//apple_ref/c/func/CFRelease

    【讨论】:

    • 谢谢。我什至在写这个问题之前就这样做了。我只是想知道为什么会这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多