调用者此时不拥有的对象的引用计数的不正确的减少

cfi*_*her 4 cocoa memory-management objective-c

我有一个非常简单的Person类,它有一个叫做名字的ivar(一个NSString).当我尝试在dealloc中释放这个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
Run Code Online (Sandbox Code Playgroud)

Dar*_*ren 18

您正在释放从属性getter方法返回的对象,在许多情况下,这将指示可能的错误.这就是静态分析正在捡起它的原因.

相反,使用:

self.name = nil;
Run Code Online (Sandbox Code Playgroud)

要么:

[name release];
name = nil;
Run Code Online (Sandbox Code Playgroud)

  • 优选后者.Apple建议不要在init和dealloc方法中使用getter或setter. (4认同)
  • 如果在子类中有观察者或覆盖触发行为,它将从`dealloc`触发,这几乎不是你想要的(因为对象的状态将是不一致的). (2认同)
  • ARC不再需要一种旧的防御习惯.如果没有ARC,只需释放`name`就会使变量仍然引用[可能现在是前者]对象.如果有任何其他消息,**BOOM**.如果你想主动防御 - 找到你发布后发出消息`name`的情况 - 使用`name =(id)0x1;`; 这将保证崩溃. (2认同)