- [Foo class]:发送到[super dealloc]上的deallocated实例的消息

时间:2012-10-11 13:52:05

标签: objective-c ios memory-management

在我的班级Foo中:

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

我在-[Foo class]: message sent to deallocated instance上获得[super dealloc]

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

任何可能导致这种情况的想法?

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

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

这在Xcode 4.6中不是问题。

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

答案 2 :(得分:0)

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

//  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,要么更有可能,您刚刚过度发布(没有相应的allocretain的版本。)

顺便提一下,我建议通过静态分析器运行代码(在“产品”菜单上选择“分析”,或按 shift + 命令 + )。您不应该有分析仪生成的任何警告。静态分析器非常适合发现各种基本的内存管理问题,这些问题往往会困扰非ARC代码。