在我的班级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之前,必须完成这项工作。
任何可能导致这种情况的想法?
答案 0 :(得分:4)
我遇到了同样的问题,并在停用Zombie Objects时解决了这个问题。但我绝对没有技术解释为什么它会有所帮助。
答案 1 :(得分:1)
调试器在正确释放对象后调用class
方法,可能是在调试器变量部分显示详细信息。 Xcode 4.4.1中的以下代码,启用了僵尸,并设置了断点,足以触发消息。
NSObject *object = [[NSObject alloc] init];
[object release];
这在Xcode 4.6中不是问题。
答案 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
,要么更有可能,您刚刚过度发布(没有相应的alloc
或retain
的版本。)
顺便提一下,我建议通过静态分析器运行代码(在“产品”菜单上选择“分析”,或按 shift + 命令 + 乙)。您不应该有分析仪生成的任何警告。静态分析器非常适合发现各种基本的内存管理问题,这些问题往往会困扰非ARC代码。