2010-11-05 1 views
4

У меня очень простой класс Person с именем ivar, называемым именем (NSString). Когда я пытаюсь выпустить этот Ивар в dealloc статический анализатор дает мне странную ошибку:Неправильный декремент подсчета ссылок объекта, который не принадлежит в этой точке вызывающим абонентом

Incorrect decrement of the reference count of an object that is not owned at this point by the caller

Что я делаю неправильно?

Кстати, вот мой код:

@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 

ответ

18

Вы выпускаете объект, возвращаемый из метода значения свойства, которые во многих случаях будет являться признаком возможной ошибки. Вот почему статический анализ подбирает его.

Вместо использования:

self.name = nil; 

или:

[name release]; 
name = nil; 
+4

Предпочтительно последнего. Apple рекомендует не использовать геттеры или сеттеры в методах init и dealloc. – Chuck

+1

Yup. Последний ftw. – bbum

+1

Вы также можете поместить его на одну строку, разделенную запятой '[name release], name = nil' – Abizern

Смежные вопросы

 Смежные вопросы