gpt4 book ai didi

iphone - 释放实例变量会导致崩溃,但为什么呢?

转载 作者:行者123 更新时间:2023-12-03 20:17:45 26 4
gpt4 key购买 nike

我有一个实例变量定义并合成为属性,如下所示:

@interface CardFrontView : GenericCardView {
UIImage *_letterImage;
}

@property (nonatomic, retain) UIImage *letterImage;

@end

@implementation CardFrontView
@synthesize letterImage = _letterImage;
...

我在 -init 中设置了 letterImage 属性:

- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self != nil) {
NSString *filename = [[NSBundle mainBundle] pathForResource:@"fehu" ofType:@"png"];
self.letterImage = [UIImage imageWithContentsOfFile:filename];
} return self;
}

然后,我在 -dealloc 中释放它,之后应用程序崩溃 (EXC_BAD_ACCESS):

- (void)dealloc {
[super dealloc];
[_letterImage release];
}

但是,我不明白应用程序崩溃的原因。有人知道这里有什么优惠吗?

最佳答案

好的...根据问题和评论中留下的线索拼凑起来。

首先,这个:

- (void)dealloc {
[super dealloc];
[_letterImage release];
}

这是错误的,并且本身可能是崩溃的根源。您告诉拥有 _letterImage 的实例进行 dealloc,然后告诉 _letterImage 进行释放。当调用 [_letterImage release] 时,包含 _letterImage 的对象已经死亡并消失了。

虽然这可能导致崩溃,但它可能不会(但这仍然应该得到修复)。在评论中,您说:

I found that the fail went away when I moved [super dealloc]. GenericCardView does nothing weird at all (just some preconfiguration that is common to a few different kinds of Cards). So, I have no idea why this happened, and it all makes me rather uncomfortable.

所有dealloc方法应始终调用[super dealloc];作为-dealloc中的最后一行代码方法的实现。始终无一异常(exception)*。

当您删除对 [super dealloc] 的调用时,一切都会开始工作,这 100% 保证表明您的代码中存在错误。

在这种情况下,如果您的 GenericCardView 类错误地管理实例变量,我不会感到惊讶。我将首先检查该类的 dealloc 方法中释放的所有变量,以确保它们首先得到正确的管理(同时还检查 dealloc 的实现本身)。

无论如何,这听起来很像过度释放问题。让你的代码回到崩溃一直发生的状态,然后使用 Instrument 的僵尸检测工具来查看它们是否捕获崩溃并识别被过度释放的对象。即使真正的原因只是您没有在 dealloc 方法中最后调用 [super dealloc],请确认 < em>这样应该会增加您的舒适度。

*实际上有一个异常(exception);当您编写自己的根类时。但这种情况极其罕见,所以还不如不计算在内。 (现在快乐吗,盖伊?:)

关于iphone - 释放实例变量会导致崩溃,但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com