为啥在构造函数中释放会导致 EXC_BAD_ACCESS?

Posted

技术标签:

【中文标题】为啥在构造函数中释放会导致 EXC_BAD_ACCESS?【英文标题】: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,但找不到它并导致崩溃。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

谢谢。我什至在写这个问题之前就这样做了。我只是想知道为什么会这样。

以上是关于为啥在构造函数中释放会导致 EXC_BAD_ACCESS?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个非常简单的构造函数会导致段错误?

为啥使用不同的 ArrayList 构造函数会导致内部数组的增长率不同?

析构函数为啥能释放对象内存?

为啥在 Objective-C 中执行 alloc 和 init 在单独的语句中会导致对象根据 Xcode 静态分析器被释放?

为啥释放内存会导致分段错误?

为啥 C++ 构造函数在继承中需要默认参数?