在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