为啥在构造函数中释放会导致 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 静态分析器被释放?