为什么Clang Static Analyzer(CSA)会输出以下消息:
虽然存储到'self'的值是 用于封闭表达式中 从来没有实际读取过的价值 '自我'
以下方法:
- (id)init
{
return (self = [super initWithStyle:UITableViewStyleGrouped]);
}
代码按预期工作,所以我想知道从技术角度看代码是不正确的,这是CSA中的一个错误,或者我只是遗漏了一些非常明显的错误。
仅供参考,我正在使用此模式,因为我不希望创建此类实例的类能够指定表样式。
答案 0 :(得分:2)
更“正确”的方法如下:
- (id)init
{
self = [super initWithStyle:UITableViewStyleGrouped];
return self;
}
它应该满足静态分析器
修改强>
我最好猜测为什么Clang不喜欢那条线:
当您编写(self = [super initWithStyle:UITableViewStyleGrouped])
时,init
调用的结果存储在临时变量中,然后将其复制到self
中,然后它就是实际的临时变量从方法中返回。
虽然这是完全合法且正常的行为(并且不会破坏您的应用),但静态分析器(正确)注意到self
中存储的值永远不会被实际读取。
为了说明,以下代码:
- (id)init
{
id temp = [super initWithStyle:UITableViewStyleGrouped];
self = temp;
return temp;
}
引发相同的静态分析器错误。
答案 1 :(得分:0)
它告诉你self =
部分是不必要的。从“破碎或危险”的意义上说,这并不是错误的,但这是毫无意义的。变量self
从未使用过,因此分配它是没有意义的。它可以简单地写成return [super initWithStyle:UITableViewStyleGrouped];
而没有任何问题。