2015-12-04 49 views
2

我有一個非常奇怪的問題正在進行。定義一個NSString對象時我犯了一個錯誤。這是一個明確的錯誤。但奇怪的是,它可以在一些iOS設備上正常工作,但會導致其他設備崩潰。iOS - NSString定義/初始化。 64位與32位

我已經修復了這個錯誤,但是我仍然處於黑暗中,爲什麼它會工作。

如果有人能幫助我理解這一點,將非常感激。

謝謝!

糟糕的代碼:

NSString *language2 = [[NSLocale preferredLanguages] objectAtIndex:0]; 

NSString *language = [language substringToIndex:2]; 
NSLog(@"language = %@", language); 

正如你可以看到, 「的NSString *語言= [語言substringToIndex:2]。」被定義爲它自己的一個子字符串。

什麼是瘋狂的是,這在一些設備上工作。我猜這是一個64/32位的東西,我只是不明白。

它在較舊的iPad上崩潰。而在較新的iPhone6上,它可以工作,NSLog指示「language = en」。

任何想法?

回答

1

如果你有ARC啓用,那麼所有的局部變量將被初始化爲NULL之前使用。那麼,你有ARC嗎?另外,在32位和64位目標之間還有一些非常不同的代碼,包括堆棧如何增長。這可能是因爲通話記錄溢出導致對象引用落入堆棧中的正確位置。

如果您想了解更多信息,請嘗試使用NSLog()打印對象的地址(@"%p")。雖然,更可能的是,你會導致不同的行爲。

總而言之,您正在玩​​未定義的行爲,並且其行爲正確性未定義。 :)

+1

謝謝!在看了一下之後,我發現64位設備並沒有崩潰,因爲內存地址是用先前的值填充的,即使這個值不正確,它仍然可以防止導致對象引用錯誤在32位設備上崩潰。感謝您的洞察力。 – mtb

+1

@mtb請注意,如果您打開優化程序或開關優化級別,行爲也可能會發生變化!在這種情況下,編譯器沒有發出警告,我感到有些驚訝。 – bbum

0

我不認爲這是由於我在不同的設備,真實設備和仿真器設備以及不同的iOS版本上嘗試了相同的代碼而導致混淆。只有我得到了StackOverExpObjectiveC[] (null)這實際上是預期的。如果你可以分享更多的項目,也許發現了奇怪的東西的基地...