Objective c 调用方此时不拥有的对象的引用计数的减少量不正确

Objective c 调用方此时不拥有的对象的引用计数的减少量不正确,objective-c,cocoa,memory-management,Objective C,Cocoa,Memory Management,我有一个非常简单的Person类,它有一个名为name(NSString)的ivar。当我试图在Dealoc中释放此ivar时,静态分析器会给我一个奇怪的错误: 参考值的减量不正确 未拥有的对象的计数 此时,由调用方 我做错了什么 顺便说一句,这是我的代码: @interface Person : NSObject { } @property (copy) NSString *name; @property float expectedRaise; @end @implementati

我有一个非常简单的Person类,它有一个名为name(NSString)的ivar。当我试图在Dealoc中释放此ivar时,静态分析器会给我一个奇怪的错误:

参考值的减量不正确 未拥有的对象的计数 此时,由调用方

我做错了什么

顺便说一句,这是我的代码:

@interface Person : NSObject {

}

@property (copy) NSString *name;
@property float expectedRaise;

@end


@implementation Person

@synthesize name, expectedRaise;

-(id) init {
    if ([super init]) {
        [self setName:@"Joe Doe"];
        [self setExpectedRaise:5.0];
        return self;
    }else {
        return nil;
    }

}

-(void) dealloc{
    [[self name] release]; // here is where I get the error
    [super dealloc];
}

@end

您正在释放一个从属性getter方法返回的对象,在许多情况下,这可能是一个bug的迹象。这就是为什么静态分析会选择它

相反,请使用:

self.name = nil;
或:


最好是后者。苹果建议不要在init和dealloc方法中使用getter或setter。你也可以把它放在一行上,用逗号分隔,name=nil如果在触发行为的子类中有观察者或重写,它将从
dealloc
触发,这绝不是你想要的(因为对象的状态将不一致)。@bbum但是为什么
release
=nil
?第一个不应该满足吗?ARC下不再需要防御的旧习惯。没有ARC,简单地释放
name
将使变量仍然引用[现在可能是前者]对象。如果还有其他消息要发送给它,砰的一声。如果你想主动防御——要找到在消息发布后你发送消息的情况,请使用
name=(id)0x1;
;这将保证崩溃。
[name release];
name = nil;