Java 如何防止自己意外使用NSNumber';当我需要它的intValue时,它是指针吗?
我非常喜欢Java的一个特性是自动装箱,在这个特性中,编译器会自动在原语和它们的包装类之间进行转换 我正在用Objective-C/Cocoa编写一个核心数据应用程序,我发现以编程方式处理整数属性令人沮丧。原因如下:Java 如何防止自己意外使用NSNumber';当我需要它的intValue时,它是指针吗?,java,objective-c,cocoa,nsnumber,autoboxing,Java,Objective C,Cocoa,Nsnumber,Autoboxing,我非常喜欢Java的一个特性是自动装箱,在这个特性中,编译器会自动在原语和它们的包装类之间进行转换 我正在用Objective-C/Cocoa编写一个核心数据应用程序,我发现以编程方式处理整数属性令人沮丧。原因如下: //img is a managed object that I have fetched NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"]
//img is a managed object that I have fetched
NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];
如果我碰巧忘记了intValue
消息(我有时会忘记),那么传递到stringWithFormat:
的int实际上就是指针值
问题是这完全是无声的——没有编译器错误或警告。有时候我会花很长时间调试这个愚蠢的问题
有没有办法改变我的编程风格或编译器设置,以防止我陷入那个陷阱
编辑:我不清楚上面的例子只是我遇到麻烦的地方之一。下面是另一个与字符串无关的假设示例:
实体CollegeClass
有两个整数属性:courseNumber
和enrollmentLimit
。假设我想比较课程编号:
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
//classFoo是我获取的NSManagedObjects
如果([[classFoo valueForKey@“courseNumber”]intValue]<400){
NSLog(“本科班”);
}
或者类似地,假设我要计算CS部门所有课程的平均注册限制。您可以使用%@将NSNumber直接转换为字符串,而不是%d
它实际上会使用任何基于NSObject的类,并将其转换为字符串。这仅适用于处理核心数据时,但如果您使用为核心数据对象生成类(我建议您还是这样做),则可以使用
-[propertyName]Value
方法,用于直接访问返回NSNumber
s的属性的正确值:
// These two methods are identical when called on a class
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];
如果“Typecheck calls to
printf
/scanf
”警告尚未打开,请打开该警告。这目前对NS/CFString格式没有帮助,但我已经提交了一个雷达增强请求(x)-radar://problem/7375186)为此。当然,欢迎你自己提交
…假设我想计算CS系所有课程的平均报名人数限制
这很容易做到。当然,这将返回一个NSNumber,这将使您再次陷入问题#2:
假设我想比较课程编号:
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
NSLog(@"undergraduate class");
}
//classFoo是我获取的NSManagedObjects
如果([[classFoo valueForKey@“courseNumber”]intValue]<400){
NSLog(“本科班”);
}
我假设您的意思是,您面临的问题是忽略intValue
消息,从而将NSNumber对象的id
与int
进行比较
编译器为此类比较提供了警告。在Xcode中,将
-Wextra
添加到“其他C标志”生成设置中。有关更多警告选项,请参阅。它将向对象发送descriptionWithLocale:
或description
,并使用该消息的结果。对于CF对象(包括CG等),它调用对象上的CFCopyDescription
。感谢您解释它的复杂性,我不知道它是如何工作的。+1这是一个解决字符串问题的好主意,但字符串不是我唯一的问题。我编辑了这个问题以提供更多的例子。我从未听说过MOGenerator。这是个好主意,但我正在寻找更简单的方法。这里的问题是,我知道我应该使用intValue,但有时我会忘记。只有当我能够对所有属性使用[propertyName]值,而不仅仅是数字数据,然后重新训练自己始终使用它时,这才有效。这正是我所寻找的。非常感谢。