【问题标题】:-[Foo class]: message sent to deallocated instance on [super dealloc]-[Foo 类]:消息发送到 [super dealloc] 上的已释放实例
【发布时间】:2012-10-11 13:52:04
【问题描述】:

在我的课堂上Foo:

[...]
- (void)dealloc
{
    NSLog(@"Foo is being dealloced!");
    [_property1 release];
    [_property2 release];
    [super dealloc];
}
[...]

我在[super dealloc] 上收到-[Foo class]: message sent to deallocated instance。

Foo 继承自 NSObject。我还没有使用ARC。在我们继续使用 ARC 之前,必须先完成这项工作。

有什么想法会导致这种情况吗?

【问题讨论】:

  • 如果您删除两个财产形象授权书是否有效?
  • 在没有更多信息的情况下无法帮助您...您可以发布 .h 和 .m 吗?
  • 我假设你从未尝试调用 [foo dealloc](你永远不应该明确调用 dealloc,除非在你的 dealloc 中调用 [super dealloc])。这是唯一会导致我能想象到的问题的事情。
  • 另外,您是否看到过一次“Foo is being deallocated”消息?还是两次?

标签: objective-c ios memory-management


【解决方案1】:

我刚刚遇到了同样的问题,并在我停用 Zombie Objects 时解决了它。但我绝对没有技术解释为什么它有帮助。

【讨论】:

  • 此处相同 - 停用 Zombie Objects 会删除此消息。
【解决方案2】:

是调试器在对象被正确释放后调用class方法,大概是为了在调试器变量部分显示细节。 Xcode 4.4.1 中的以下代码,启用了僵尸,设置断点就足以触发消息。

NSObject *object = [[NSObject alloc] init];
[object release];

这在 Xcode 4.6 中不是问题。

在此处查看更长的答案https://stackoverflow.com/a/14734241/1347502

【讨论】:

    【解决方案3】:

    您可以发布更多代码吗?我尝试了以下方法:

    //  Foo.h
    
    #import <Foundation/Foundation.h>
    
    @interface Foo : NSObject
    
    @property (nonatomic, strong) NSString *property1;
    @property (nonatomic, strong) NSString *property2;
    
    @end
    

    和

    //  Foo.m
    
    #import "Foo.h"
    
    @implementation Foo
    
    - (id)init
    {
        self = [super init];
    
        if (self)
        {
            _property1 = nil;
            _property2 = nil;
        }
    
        return self;
    }
    
    - (void)dealloc
    {
        NSLog(@"%s Foo is being dealloced!", __FUNCTION__);
        [_property1 release];
        [_property2 release];
        [super dealloc];
    }
    
    @end
    

    当我从我的视图控制器中使用它时,它就像一个冠军,例如:

    //  ViewController.m
    
    #import "ViewController.h"
    #import "Foo.h"
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        Foo *foo = [[Foo alloc] init];
    
        foo.property1 = [NSString stringWithFormat:@"My name is %@", @"Rob"];
        foo.property2 = [NSString stringWithFormat:@"My age is %d", 29];
    
        [foo release];
    }
    
    @end
    

    我在 Xcode 4.5.1 中做了这个测试。也许您可以(a)确认这对您有用; (b) 验证上述代码与您的代码之间的差异,以诊断问题的根源。

    很明显,问题不是由您对Foo 的定义引起的,而可能是您的其他类如何创建并最终释放您的Foo 对象的结果。您要么在某个地方调用 dealloc,要么更可能的是,您刚刚过度发布(没有对应的 alloc 或 retain 的发布)。

    顺便说一句,我建议通过静态分析器运行您的代码(在“产品”菜单上选择“分析”,或按 shift+command+ B)。分析器不应该产生任何警告。静态分析器非常擅长发现各种容易困扰非 ARC 代码的基本内存管理问题。

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 1970-01-01
      • 2011-06-16
      • 2023-03-13
      相关资源
      最近更新 更多