1

在我的课上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 之前,必须完成这项工作。

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

4

3 回答 3

4

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

于 2012-11-29T09:29:07.110 回答
1

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

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

这在 Xcode 4.6 中不是问题。

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

于 2013-02-06T16:56:48.353 回答
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某个地方打电话,要么更有可能,你刚刚过度发布(一个没有相应allocor的发布retain)。

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

于 2012-10-22T19:37:50.577 回答