问题描述
这个问题已经在这里有了答案:
解决方法
应该从字面上理解“从未使用过”:您只能在分配中定义其值,而从不使用它。
这与对局部变量的警告相同:如果仅定义它们的值而从不使用它,它们的作用是什么?
因此,静态分析器会警告您,因为通常永远不会访问的变量只是已更改的旧代码的剩余部分,您可以删除它们。但是在您的情况下,这可能会很好。
,“ 0”行影响属性“ bar”的设置器和获取器的操作方式。该行:
@synthesize bar = _bar;
有效地说:“按照我将其声明为@property
的方式,为bar输入标准的getter(和setter,如果相关的话),但是将实例变量_bar用于存储”。
当将self.bar用作左值时,实际上是在对[self setBar:]
进行方法调用,而当将它用作右值时,实际上是在对[self bar]
进行调用。它看起来像一个普通的C样式结构成员访问,但在内部它是一个方法调用。
因此,ѭ0创建一个合适的getter和setter以用于self.bar
,但不会更改实例变量的名称。因此,从类本身内部直接访问事物时,应该正确使用ѭ7(尽管有些人现在从样式的角度上对此感到不满意),否则应使用self.bar
,而不会收到任何分析器警告。
对于最后一个名为bar
的实例变量,假设您没有在接口内声明一个,则最可能的错误是执行performed0ѭ的方式中的错误。在现代运行时中,您可以为尚未在接口中实际声明的变量提供@property/@synthesize
对,并且该变量将被神奇地添加到您的接口中。因此,如果您不幸输入错字,可能会意外地这样做。
如果可能,您可以发布您的实际代码吗?
,请看我的评论。
尝试添加-dealloc
方法来释放对象。这将“访问” Ivar,并使静态分析器满意。
-(void)dealloc
{
[bar release]; bar = nil;
[super dealloc]
}
,现在,我可以在8小时后回答我的问题,我正在为在测试或某些过程中与我犯同样错误的任何人这样做。但是,塞尔吉奥和汤米的答案很有帮助。
阅读答案后,我发现自己犯了一个愚蠢的错误。在对类进行编码的测试期间,我在实例变量声明之前删除了下划线。所以我的实际代码确实是这样的:
@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