为什么在构造函数中释放导致EXC_BAD_ACCESS?

时间:2015-07-15 14:22:01

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

我有以下类构造函数

- (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,但无法找到它并导致崩溃。

1 个答案:

答案 0 :(得分:2)

您只需在创建(CGImageCreate),复制或保留对象时调用CGImageRelase。 [maskUI CGImage]并未申请新的所有权,因此您不负责发布所有权。

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

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