當使用NSObject valueForKey:
作爲布爾類型屬性(來自其他人的示例代碼here)時,返回的NSNumber不是@encode(BOOL) = "c"
- 它是「一世」。爲什麼?關鍵值編碼:BOOL屬性評估爲類型「i」,而不是「c」的NSNumber
0
A
回答
2
BOOL
不是基本類型,它是signed char
的typedef。因此,在運行時不可能判斷一個屬性是布爾值還是隻是一個整數值。因此,我們可以確定-valueForKey:
未使用+numberWithBool:
來包裝該值。所以問題是,爲什麼不使用+numberWithChar:
?可能爲了簡單起見。如果所有帶符號整數值< = sizeof(int)
都使用+numberWithInt:
打包,則不會令我感到意外。真正的問題是,它爲什麼重要?如果您詢問產生的NSNumber
對象-boolValue
,您將得到正確的答覆。
-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
要求的objCType
n
是NSNumber
,就會得出這樣i
是結果而不是c
。
+0
'NSNumber'不一定有'i'類型。 – 2012-02-08 20:08:27
相關問題
- 1. BOOL評估Objective-C
- 2. 字段評估爲值(0.0),而不是類型SHORT-FLOAT
- 3. 評估「值」屬性
- 4. 使用評估的變量值,而不是實際類型
- 5. 類不是關鍵值編碼兼容
- 6. 評估屬性值爲數字,而不是指令內的字符串
- 7. 評估結構爲bool
- 8. Objective-C這個類不是關鍵值findContact的關鍵值編碼。
- 9. 爲什麼PyRun_String不評估bool文字?
- 10. 該類不是關鍵值編碼兼容的關鍵tableView
- 11. 這個類不是關鍵值編碼兼容的關鍵scrollView
- 12. 這個類不是關鍵值編碼兼容的關鍵imageView
- 13. 爲什麼Where-Object會評估源對象上的所有*屬性而不是相關的屬性?
- 14. C++ - 數據類型不同地評估
- 15. 類不是鍵值編碼兼容上推出的關鍵
- 16. 這個類不是鍵值編碼兼容的關鍵
- 17. 該類不是鍵值編碼兼容的關鍵問題
- 18. 我應該使用NSNumber而不是基本的C號碼類型嗎?
- 19. 類不是關鍵值編碼兼容的不存在的IBAction
- 20. 這個類是不是關鍵值編碼兼容的關鍵......再次
- 21. 帶鍵值編碼和BOOL的JSONKit
- 22. 角結合屬性評估值
- 23. 是否有任何情景(i!= i)會被評估爲真?
- 24. C#可爲空類型和值屬性
- 25. 是不是非類型參數包,評估爲「void ...」非法?
- 26. 使用表達式樹來評估泛型類的屬性
- 27. Xcode6 Beta6:這個類不是鍵值編碼兼容的名爲「IBtextFieldName」關鍵
- 28. 不是關鍵值編碼兼容
- 29. C++不能從BOOL類型(類)轉化爲bool
- 30. 錯誤而與sortedArrayUsingDescriptors排序:「類不是密鑰值編碼兼容的關鍵」
這個問題大多隻是教學法,但是我在測試'@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
@Stephen:好問題。儘管'NSNumber'似乎沒有C99'bool'的任何初始值設定項,所以我期望它使用> ='sizeof(bool)'的整數類型之一,例如'int'。 – 2012-02-08 20:35:49