2

为什么 Clang 静态分析器 (CSA) 会输出以下消息:

尽管在封闭表达式中使用了存储到“self”的值,但实际上从未从“self”中读取该值

对于以下方法:

- (id)init
{
    return (self = [super initWithStyle:UITableViewStyleGrouped]);
}

代码按预期工作,所以我想知道从技术角度来看代码是否不正确,这是 CSA 中的一个错误,或者我只是遗漏了一些非常明显的东西。

仅供参考,我使用这种模式是因为我不希望创建此类实例的类能够指定表格样式。

4

2 回答 2

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;
}

引发相同的静态分析器错误。

于 2009-12-23T02:23:56.123 回答
0

它告诉你这self =部分是不必要的。从“破碎或危险”的意义上说,这并不是不正确的,但它毫无意义。该变量self从未使用过,因此分配给它没有意义。它可以简单地写成return [super initWithStyle:UITableViewStyleGrouped];没有任何问题。

于 2009-12-23T03:13:10.870 回答