我有一个非常奇怪的问题。我在定义NSString对象时犯了一个错误。这是一个明显的错误。但奇怪的是它在某些iOS设备上运行良好,但在其他设备上却会崩溃。
我已经修复了这个错误,但是我仍然处于黑暗状态,为什么它会起作用。
如果有人能帮助我理解这一点,我们将非常感激。
谢谢!
错误代码:
NSString *language2 = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *language = [language substringToIndex:2];
NSLog(@"language = %@", language);
如您所见,“NSString * language = [language substringToIndex:2];”被定义为自身的子串。
有些疯狂的是,这适用于某些设备。我猜它是64/32位的东西,我只是不明白。
它在较旧的iPad上崩溃了。在较新的iPhone6上,它可以工作,NSLog显示“language = en”。
有什么想法吗?
答案 0 :(得分:1)
如果启用了ARC,则在使用之前,所有局部变量都将初始化为NULL。那么,你有ARC启用吗?此外,32位和64位目标之间存在一些截然不同的代码,包括堆栈的增长方式。可能是你“幸运”了,由于呼叫中的寄存器溢出,对象引用落入堆栈的正确位置。
如果您想了解更多信息,请尝试使用NSLog()打印对象的地址(@"%p"
)。但是,更有可能的是,你会导致不同的行为。
总而言之,您正在使用未定义的行为,并且它正在以未定义的方式正常运行。 :)
答案 1 :(得分:0)
我不认为这是导致混淆的想法,因为我在不同的设备,真实设备和模拟器设备以及不同的iOS版本上尝试了相同的代码。只有我得到的StackOverExpObjectiveC[] (null)
实际上是预期的。如果你可以分享你的项目的更多可能找到奇怪的东西......