2015-10-19 51 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的,或粘貼「AB」,然後輸入「C」,該按鈕始終被禁用。但是,如果我一個一個地輸入這三個字母,按鈕就會按照它應該的那樣執行。所有這三種情況都達到了self.button.enabled =(BOOL)3,但爲什麼按鈕的性能不同呢?

回答

4

BOOL

的不同行爲的類型實際上是鏈接到該設備的架構。 iOS SDK如何爲32位和64位體系結構定義BOOL是有區別的。從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); 

這就是爲什麼你會看到不同設備上的不同行爲。

編輯:發表評論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