iOS - NSString定义/初始化。 64位对比32位

时间:2015-12-04 23:40:11

标签: ios objective-c ios8 ios9

我有一个非常奇怪的问题。我在定义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”。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果启用了ARC,则在使用之前,所有局部变量都将初始化为NULL。那么,你有ARC启用吗?此外,32位和64位目标之间存在一些截然不同的代码,包括堆栈的增长方式。可能是你“幸运”了,由于呼叫中的寄存器溢出,对象引用落入堆栈的正确位置。

如果您想了解更多信息,请尝试使用NSLog()打印对象的地址(@"%p")。但是,更有可能的是,你会导致不同的行为。

总而言之,您正在使用未定义的行为,并且它正在以未定义的方式正常运行。 :)

答案 1 :(得分:0)

我不认为这是导致混淆的想法,因为我在不同的设备,真实设备和模拟器设备以及不同的iOS版本上尝试了相同的代码。只有我得到的StackOverExpObjectiveC[] (null)实际上是预期的。如果你可以分享你的项目的更多可能找到奇怪的东西......