2012-02-08 24 views

回答

2

BOOL不是基本類型,它是signed char的typedef。因此,在運行時不可能判斷一個屬性是布爾值還是隻是一個整數值。因此,我們可以確定-valueForKey:未使用+numberWithBool:來包裝該值。所以問題是,爲什麼不使用+numberWithChar:?可能爲了簡單起見。如果所有帶符號整數值< = sizeof(int)都使用+numberWithInt:打包,則不會令我感到意外。真正的問題是,它爲什麼重要?如果您詢問產生的NSNumber對象-boolValue,您將得到正確的答覆。

+0

這個問題大多隻是教學法,但是我在測試'@encode(BOOL)'和'NSNumber objCType'時發現它沒有按預期工作。我不知道使用C99 bool會有什麼結果?根據[docs](https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html),有一種專門用於這種形式的bool的特殊類型。 – Stephen 2012-02-08 20:33:31

+0

@Stephen:好問題。儘管'NSNumber'似乎沒有C99'bool'的任何初始值設定項,所以我期望它使用> ='sizeof(bool)'的整數類型之一,例如'int'。 – 2012-02-08 20:35:49

-1

這是從鏈接網站的代碼:

MyClass *c = [[MyClass alloc] init]; 
c.aaa = YES; 

NSNumber *n = [c valueForKey:@"aaa"]; 

NSString *s = [NSString stringWithCString:[n objCType] encoding:NSUTF8StringEncoding]; 
NSLog(@"ObjC type - %@", s); // Prints 'i' instead of 'c' 

這似乎是您正在使用[n objCType]; 時,由於n要求的objCTypenNSNumber,就會得出這樣i是結果而不是c

+0

'NSNumber'不一定有'i'類型。 – 2012-02-08 20:08:27

相關問題