为什么'[self.pickerSubArray indexOfObject:self.txtSubCategory.text]'返回'2147483647'?

时间:2010-12-29 22:22:16

标签: iphone objective-c

为什么'[self.pickerSubArray indexOfObject:self.txtSubCategory.text]'返回'2147483647';而相同的字符串值参数'[self.pickerSubArray indexOfObject:@“Mark”]'会根据需要调出4?

3 个答案:

答案 0 :(得分:13)

NSArray的Apple文档(我假设您的对象基于名称)表示如果对象与数组中的任何对象不匹配,indexOfObject:将返回NSNotFoundNSNotFound本身被定义为NSIntegerMax,正如其他人所指出的那样,indexOfObject:是你要回归的价值。

isEqual:使用{{1}}来比较项目,因此理论上如果文本相同则应该正常工作。也许文本实际上在某些方面与您没有注意到的不同,例如大小写(“Mark”与“mark”)或额外填充(“Mark”与“Mark”)。

答案 1 :(得分:-1)

indexOfObject:如果无法找到您的确切对象,则会返回NSNotFoundNSNotFound定义为NSIntegerMax,即2147483647。

为什么这样做?我很确定indexOfObject:测试相同的对象,而不是具有相同内容的对象。 e.g。

NSString *mark1 = [NSString stringWithString:@"Mark"];
NSString *mark2 = [NSString stringWithString:@"Mark"];

mark1不一定等于mark2,因为它们是两个不同的对象。

NSString *mark1 = [NSString stringWithObject:@"Mark"];
NSString *mark2 = mark1;

mark1等于mark2;

BUT!由于编译器试图最小化内存占用,因此它会将代码中的所有文字字符串转换为一个常量字符串。这就是[[NSArray arrayWithObject:@"Mark"] indexOfObject:@"Mark"]有效的原因,但即使textField.text中的文本为“Mark”,[[NSArray arrayWithObject:@"Mark"] indexOfObject:textField.text]也不起作用。

你如何解决它......好吧,indexOfObject:来自文档看起来像indexOfObject:基于isEqual:所以你应该测试[self.txtSubCategory.text isEqual:@“Mark”]。排除错误的值或断开连接的插座等。之后,您可能必须重构不使用indexOfObject:

答案 2 :(得分:-2)

只是猜测数字原点 - 这是一个错误的整数转换。这很可能意味着返回-1。

这让我相信你可能在基础图书馆/语言中找到了一些不好。