luc*_*nik 2 iphone objective-c
我正在将我们的iPhone应用程序更新为iOs4,我在代码中遇到了"函数调用中的传递参数未定义"的问题
for (i = 0; i < self.numberOfSegments; i++) {
[self setWidth:round(width[i]) forSegmentAtIndex:i];
}
Run Code Online (Sandbox Code Playgroud)
这是公平的,宽度[i]尚未初始化.然而,更新代码(下面)给了我这个新错误,"分配的值是垃圾或未定义".读到这个我认为segWidth保留其作为垃圾的价值 - 这是正确的,如果是这样,我该如何清除它?
for (i = 0; i < self.numberOfSegments; i++) {
float segWidth = (float)width[i];
[self setWidth:round(segWidth) forSegmentAtIndex:i];
}
Run Code Online (Sandbox Code Playgroud)
-------------编辑------------------
谢谢回复人员.更多信息如下;
该方法的泛化版本在下面显示为someFunction.我删除了丑陋的演员,但仍然看到该行的"Assigned Value is Garbage or undefined"逻辑错误segWidth = width[i];
我同意值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];
}
}
Run Code Online (Sandbox Code Playgroud)
setWidth的定义是:
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment; // set to 0.0 width to autosize. default is 0.0
Run Code Online (Sandbox Code Playgroud)
我假设你在打电话:
- (void)setWidth:(CGFloat)width forSegmentAtIndex:(NSUInteger)segment
Run Code Online (Sandbox Code Playgroud)
函数调用中的Pass-by-argument未定义实际上是构建和分析时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++) {
...
}
Run Code Online (Sandbox Code Playgroud)
静态分析器不知道这一点n == self.numberOfSegments,因此必须假设第二个循环可以比第一个循环更长.现在,你可能会说,"但我n = self.numberOfSegments上面指定了什么?!"
你做了,但是在第一次调用和第二次调用之间该值可能已经改变,因此,分析器已正确识别出您可能正在使用未初始化的值.
(实际上,应该说你可能会跑掉数组的末尾,因为那是真正的风险).
| 归档时间: |
|
| 查看次数: |
2969 次 |
| 最近记录: |