分配的值是XCode中的垃圾或未定义的逻辑错误

时间:2010-07-28 01:06:23

标签: iphone objective-c

我正在将我的iPhone应用程序更新为iOs4,我在代码中遇到了“函数调用中的传递参数未定义”的问题

for (i = 0; i < self.numberOfSegments; i++) {
        [self setWidth:round(width[i]) forSegmentAtIndex:i];
}

这是公平的,宽度[i]尚未初始化。然而,更新代码(下面)给了我这个新错误,“分配的值是垃圾或未定义”。读到这个我认为segWidth保留其作为垃圾的价值 - 这是正确的,如果是这样,我该如何清除它?

for (i = 0; i < self.numberOfSegments; i++) {
    float segWidth = (float)width[i];
    [self setWidth:round(segWidth) forSegmentAtIndex:i];
}

-------------编辑------------------

感谢回复人员。更多信息如下;

该方法的泛化版本在下面显示为someFunction。我删除了丑陋的演员,但仍然看到行segWidth = width[i];

的“Assigned Value is Garbage or undefined”逻辑错误

我同意值width [i]没有明确的初始化,我不确定这是否是我对基本的Obj-c float类型的理解不足或者我的赋值语法中是否存在逻辑缺陷?

- (void)someFunction
{
    unsigned int n = self.numberOfSegments;
    float width[n];

    for (i = 0; i < n; i++) {
       width[i] = someFloatValue;
    }

    ...    

    for (i = 0; i < self.numberOfSegments; i++) {
       float segWidth = 0.0;
       segWidth = width[i];

       [self setWidth:round(segWidth) forSegmentAtIndex:i];
    }

}

setWidth的定义是:

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment;         // set to 0.0 width to autosize. default is 0.0

1 个答案:

答案 0 :(得分:5)

我假设你在打电话:

- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment

函数调用中的传递参数未定义实际上是构建和分析时LLVM静态分析器错误。 (两个相当重要的数据点 - 正好传递你正在做的事情以及输出的确切内容非常有帮助。)

你说width[i]尚未初始化。

您添加float segWidth = (float)width[i]的修复程序应该导致分析器抱怨**分配的值是垃圾或未定义**。您实际上没有将width[i]设置为任何内容。我建议对静态分析器提出一个错误,因为第一条错误消息确实非常彻底。

正如约书亚所说,演员阵容也很奇怪。一般来说,在Objective-C中,你很少需要使用类型转换,而且几乎从不在标量类型上使用它。


考虑两个循环计数:

for (i = 0; i < n; i++) {
...
}


for (i = 0; i < self.numberOfSegments; i++) {
...
}

静态分析器不知道n == self.numberOfSegments,因此必须假设第二个循环可以比第一个循环更长。现在,您可能会说,“但我上面分配了n = self.numberOfSegments?”

你做到了,但是这个值可能在第一次调用和第二次调用之间发生了变化,因此,分析器已经正确识别出你可能正在使用未初始化的值。

(真的,应该说你可能会跑掉数组的末尾,因为那是真正的风险)。