爪哇我很喜欢的是自动装箱,其中,所述编译器原语及其包装类之间自动转换。的一个特征

我写在Objective-C /可可核心数据的应用程序,而且我发现它令人沮丧对付我的整数编程属性。这里的原因:

//img is a managed object that I have fetched

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];  

如果我碰巧忘记intValue消息,该消息本人有时尽,则得到数据传递给stringWithFormat:整型实际上是指针值。

的问题是,这种情况是完全安静的 - 没有编译错误或警告。有时候,我会花了太多的时间调试时,这个愚蠢的,愚蠢的事情的问题。

有没有办法改变我的编程风格和我的编译器设置,以阻止我被逮住的那个陷阱?

修改:我不清楚有关的事实,上面的例子只是许多地方,我遇到了麻烦之一。下面是没有用绳子做的另一个假设的例子:

实体CollegeClass具有两个整数属性:courseNumberenrollmentLimit。比方说,我想比较课程编号:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

或类似的,假设我要计算平均入学率限制在CS部门中的所有类。

有帮助吗?

解决方案

  

...假设我要计算平均入学率限制在CS部门中的所有类。

这是容易 NSArray的做和NSSet中的@avg操作的。当然,这会返回一个NSNumber,这使你回到问题#2:

  

比方说,我想比较课程编号:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

我想你意味着你的风险问题省略intValue消息,从而所述的NSNumber对象的id比较到int

在编译器提供用于这种比较的警告。在Xcode中,添加-Wextra到你的“其他C标志”构建设置。欲了解更多的警告选项,请参见完整列表的GCC警告的。

其他提示

可以使用%@到的NSNumber直接转换为字符串,而不是%d。

这实际上将采取任何NSObject的基础类,并将其转换为字符串,我相信。

这与核心数据处理时只适用,但如果您使用 MOGenerator 来生成类你的核心数据对象(我建议你做反正),然后您可以使用-[propertyName]Value方法来直接访问正确的值对于返回NSNumbers属性:

// These two methods are identical when called on a class 
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];

打开“类型检查调用printf / scanf”的警告,如果不上了。这不的目前的与NS / CFString字符串格式的帮助,但我已经提交了雷达增强请求(X-雷达://问题/ 7375186)了点。欢迎您提交自己的,当然。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top