在Objective-C 2.0中带有下划线的实例variables和用@synthetize重命名会导致Xcode 4的“分析”工具产生优化警告

可能重复:
如何在cocoaObjective-C类中的variables前面加下划线?

我使用相同的约定为实例variables和属性命名sebnow所示在他的以下答案:

目标C中的实例variables/方法参数命名

我在这里复制粘贴他的示例代码:

@interface Foo : NSObject { id _bar; } @property (nonatomic, retain) id bar; - (id) initWithBar:(id)aBar; @end @implementation Foo @synthesize bar = _bar; - (id) initWithBar:(id)aBar { self = [super init]; if(self != nil) { _bar = aBar; } return self; } @end 

在实现Foo类的一些方法时,我使用了例如:

 _bar = aBar 

而不是使用:

 bar = aBar 

Xcode 4引入的“分析”工具给了我这个警告(我正在使用版本4.0.2):

类“Foo”中的实例variables“bar”从来不会被其实现的@implementation中的方法使用(虽然它可以被类别方法使用)

也许我应该使用:

 self.bar = aBar 

但是对于只读属性,这是行不通的,除此之外,我不确定在课堂上使用setter是否是一个好习惯。

我在Objective-C中并不新鲜,但我还处于学习的开始阶段。 也许我做错了什么,在某个地方有一个糟糕的编码习惯。

如果你能帮助我,请提前致谢;)

应该从字面上理解“从不使用”:你只是在作业中定义它的价值,决不使用它。

这与你获得本地variables的警告是一样的:如果你只定义它们的值而不使用它,它们是什么?

因此,静态分析器会警告你,因为一般来说,从不被访问的variables只是旧代码的变化,你可以删除它们。 但在你的情况下,这可能是非常好的。

@synthesize行会影响属性“bar”的setter和getter的操作。 该行:

 @synthesize bar = _bar; 

有效地说“把标准的getter(和setter,如果相关)放到bar中,按照我声明的@property的方式,但是使用实例variables_bar作为存储”。

当你使用self.bar作为左值时,你实际上正在调用[self setBar:] ,当你用它作为右值时,你实际上正在调用[self bar] 。 它看起来像一个普通的C风格结构成员访问,但在内部它是一个方法调用。

所以,@ @synthesize创build一个合适的getter和setter用于self.bar ,但不会更改实例variables的名称。 因此,在直接从类内部访问事物时,应该使用_bar是正确的(尽pipe有些人从风格的angular度self.bar ),而self.bar则没有收到任何分析器警告。

假设你没有在你的界面中声明一个实例variables,那么你最终会得到一个名为bar的实例variables,最可能的错误就是你执行@synthesize出错。 在现代运行时中,您可以为您在界面中实际未声明的variables提供@property/@synthesize对,并且该variables将以奇迹forms添加到您的界面中。 所以,如果你犯了一个不幸的错字,你可以意外地做到这一点。

如果可能的话,你可以发布你的实际代码吗?

请看我的评论。

尝试添加-dealloc方法释放对象。 这将“访问”伊瓦尔,并应该使静态分析仪高兴。

 -(void)dealloc { [bar release]; bar = nil; [super dealloc] } 

现在,我可以在8小时后回答我的问题,我正在为那些在testing中犯了同样错误的人做这件事。 然而,塞尔吉奥和汤米的答案是非常丰富的。

看完答案后,我看到我犯了一个愚蠢的错误。 在对我的类进行编码testing期间,我在实例variables声明之前删除了下划线。 所以我真正的代码是这样的:

 @interface Foo : NSObject { id bar; } @property (nonatomic, retain) id bar; - (id) initWithBar:(id)aBar; @end @implementation Foo @synthesize bar = _bar; - (id) initWithBar:(id)aBar { self = [super init]; if(self != nil) { _bar = aBar; } return self; } @end 

所以分析警告是正确的。 对不起,虚惊一场! 但是,非常快速的答案,谢谢。

使用这个 – >

 @interface Foo : NSObject { id _bar; } @property (nonatomic, retain) id _bar; - (id) initWithBar:(id)aBar; @end @implementation Foo @synthesize bar = _bar; - (id) initWithBar:(id)aBar { self = [super init]; if(self != nil) { bar = aBar; } return self; } @end