为什么'[self.pickerSubArray indexOfObject:self.txtSubCategory.text]'返回'2147483647';而相同的字符串值参数'[self.pickerSubArray indexOfObject:@“Mark”]'会根据需要调出4?
答案 0 :(得分:13)
NSArray的Apple文档(我假设您的对象基于名称)表示如果对象与数组中的任何对象不匹配,indexOfObject:
将返回NSNotFound
。 NSNotFound
本身被定义为NSIntegerMax
,正如其他人所指出的那样,indexOfObject:
是你要回归的价值。
isEqual:
使用{{1}}来比较项目,因此理论上如果文本相同则应该正常工作。也许文本实际上在某些方面与您没有注意到的不同,例如大小写(“Mark”与“mark”)或额外填充(“Mark”与“Mark”)。
答案 1 :(得分:-1)
indexOfObject:
如果无法找到您的确切对象,则会返回NSNotFound
。 NSNotFound
定义为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。
这让我相信你可能在基础图书馆/语言中找到了一些不好。