2015-12-04 2 views
2

У меня очень странная проблема. Я допустил ошибку при определении объекта NSString. Это явная ошибка. Но странно, что он отлично работает на некоторых устройствах iOS, в то время как он вызывает сбои на других.iOS - определение/инициализация NSString. 64bit vs 32bit

Я исправил ошибку, но я все еще в темноте, почему она когда-либо работала.

Если кто-нибудь может помочь мне понять это, мы будем очень благодарны.

Спасибо!

Bad Код:

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

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

Как вы можете видеть, "NSString * язык = [язык substringToIndex: 2];" определяется как подстрока сама по себе.

Что сходит с ума, так это то, что это работает на некоторых устройствах. Я предполагаю, что это 64/32 бит вещь, которую я просто не понимаю.

Он падает на более старый iPad. Хотя на новом iPhone6 ​​он работает, и NSLog указывает «язык = en».

Любые идеи?

ответ

1

Если у вас включен ARC, вся локальная переменная будет инициализирована до NULL перед использованием. Итак, у вас есть ARC? Кроме того, есть довольно радикально различный кодеген между 32-битной и 64-разрядной мишенью, включая то, как растет стек. Возможно, вам «повезло», и ссылка на объект попала в нужное место в стеке из-за разлива из регистров при вызове.

Если вы хотите узнать больше, попробуйте использовать NSLog() для печати адреса объекта (@"%p"). Хотя, скорее всего, вы столкнетесь с другим поведением.

В целом, вы играете с неопределенным поведением, и оно ведет себя нестандартно. :)

+1

Спасибо! После некоторого взгляда кажется, что мне «повезло», когда 64-разрядные устройства не сбой, поскольку адрес памяти заполнен предыдущим значением ... хотя значение неверно, оно все еще предотвращает ошибку ссылки на объект, которая вызывает сбой на 32-битных устройствах. Спасибо за понимание. – mtb

+1

@mtb Обратите внимание, что поведение также может измениться, если вы включите оптимизатор или уровни оптимизации переключателей! На самом деле я немного удивлен, что компилятор в этом случае не предупреждал. – bbum

0

Я не думаю, что это вызывает путаницу, так как я пробовал ТОЧНО тот же код на разных устройствах, реальных устройствах и эмуляторных устройствах и разных версиях iOS. Единственное, что я получил StackOverExpObjectiveC[] (null), который действительно ожидается. Если бы вы могли поделиться своим проектом, возможно, нашли бы базу странных вещей ...

Смежные вопросы