代码之家  ›  专栏  ›  技术社区  ›  Jonathan Sterling

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

  •  2
  • Jonathan Sterling  · 技术社区  · 16 年前

    我定义了一个实例变量,并将其合成为如下属性:

    @interface CardFrontView : GenericCardView {
        UIImage *_letterImage;
    }
    
    @property (nonatomic, retain) UIImage *letterImage;
    
    @end
    
    @implementation CardFrontView
    @synthesize letterImage = _letterImage;
    ...
    

    letterImage 中的属性 -init

    - (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];
    }
    

    然而,我不明白为什么应用程序会崩溃。有人知道这是什么交易吗?

    3 回复  |  直到 16 年前
        1
  •  20
  •   bbum    16 年前

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

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

    是错误的,可能是坠机的根源。您正在告诉拥有 _letterImage 解除锁定 然后 _字母图像 释放。到…的时候 [_letterImage release] 调用,对象包含 已经死了。

    尽管如此 导致崩溃,它可能不是(但仍然应该被修复)。你在评论中说:

    我发现当我搬家的时候失败就消失了。 所有(只是一些预先设定 是几种不同类型的 Card s) 是的。所以,我不知道为什么会这样 不舒服。

    全部 dealloc 方法应该总是调用 [super dealloc]; 作为 -dealloc . 总是毫无例外*。

    当你删除对的呼叫时,任何东西都开始工作 [super dealloc]

    在这种情况下,我不会感到惊讶,你的 GenericCardView 释放内存 方法来确保它们在第一时间得到正确的管理(同时还要检查dealloc的实现本身)。

    无论如何,这闻起来很像一个过度释放的问题。让你的代码回到崩溃一直发生的状态,然后使用仪器的僵尸检测工具,看看他们是否捕捉到崩溃,并确定对象被过度释放。即使真正的原因是 只有 [超级解除锁定] 你生命中的最后一个 方法,确认 这种情况应该会增加你的舒适度。

        2
  •  3
  •   Nathan de Vries    16 年前

    除了要求您发布或以其他方式发布的约定之外,您的代码真正的问题是[super dealloc]后面还有其他问题。一旦调用了该方法,就不能再对对象执行任何操作。

    取而代之的是,先做你的局部清理,只有当你做了之后,再打电话给上级。

    它基本上与init方法相反,在super init调用之前,您不能做任何有用的事情。

    亚历克斯

        3
  •  1
  •   Ian Henry    16 年前

    你曾经在你的代码中的任何其他点访问过这个吗?我唯一能想到的是,它被释放到其他地方,而不是首先被保留。

    [super dealloc] 电话是第一个,而不是最后一个。虽然把它放在最后是一个很好的做法,但我的印象是,它没有功能上的区别——你在超级类中做了什么奇怪的事情,可能会导致它?