2015-10-19 1 views
3

У меня есть textView и кнопка. Свойство Button enabled связано с длиной текста в textView. Я напрямую назначаю NSUInteger BOOL, который сейчас окажется непригодным.Смутно о UITextView, UIButton и BOOL

- (void)textViewDidChange:(UITextView *)textView { 
    self.button.enabled = textView.text.length; //unsuitable on 32-bit. Should be `textView.text.length > 0` 
} 

Странная вещь на 32-разрядных устройств: Если я вставляю «ABC» в TextView, или вставить «аб» введите «с», кнопка всегда отключена. Но если я набираю эти три буквы один за другим, кнопка работает так, как должна быть. Все 3 ситуации достигают self.button.enabled = (BOOL) 3, но почему производительность кнопки отличается?

ответ

4

Тип BOOL

Различная поведение на самом деле связано с архитектурой устройства. Существует различие в том, как SDK для iOS определяет BOOL для 32-х и 64-разрядных архитектур. Смотрите этот отрывок из objc.h:

#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__ 
typedef bool BOOL; 
#else 
typedef signed char BOOL; 
#endif 

BOOL Так на 32 бит может иметь любое значение в диапазоне от 0 до 255, а на 64-битной он компилятор применяются только иметь значения 0 или 1. Вы можете легко попробовать это по используя следующую строку на симуляторе, настроенную на iPhone 4s (32 бит) или iPhone 6 (64 бит).

NSLog(@"%d", (BOOL)2); 

Именно поэтому вы видите различное поведение на разных устройствах.

EDIT: сообщение OP комментарий:

Ну, чтобы понять, что вам нужно, чтобы увидеть, как enabled свойство укладывают: unsigned int enabled:1. Это определяет бит-поле шириной 1.

В системах 32 bit по стандарту C при назначении целого числа без знака большей ширины оставшиеся биты просто отбрасываются. Таким образом, самый младший бит - это то, что фактически управляет включением/отключением кнопки.

+1

Это должен быть выбран ответ. Абсолютно правильно. –

+0

@Abhinav Спасибо за ответ, но вы не можете воспользоваться ключом моего вопроса. Например, строка «abc». В 32-битном режиме, если я вставляю «abc» в textView или вставляю «ab», тогда введите «c», кнопка всегда отключена. Но если я набираю эти буквы один за другим, кнопка работает так, как должна быть. Все три ситуации достигают 'self.button.enabled = (BOOL) 3', правильно? – xuning0

+0

Пожалуйста, взгляните на мое обновленное сообщение. Все ваши три случая лежат в младшем разряде, который равен 1 для нечетных чисел и 0 для четных чисел. – Abhinav