Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止自己意外使用NSNumber';当我需要它的intValue时,它是指针吗?_Java_Objective C_Cocoa_Nsnumber_Autoboxing - Fatal编程技术网

Java 如何防止自己意外使用NSNumber';当我需要它的intValue时,它是指针吗?

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"]

我非常喜欢Java的一个特性是自动装箱,在这个特性中,编译器会自动在原语和它们的包装类之间进行转换

我正在用Objective-C/Cocoa编写一个核心数据应用程序,我发现以编程方式处理整数属性令人沮丧。原因如下:

//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]值,而不仅仅是数字数据,然后重新训练自己始终使用它时,这才有效。这正是我所寻找的。非常感谢。