2015-08-21 74 views
4

我最近向蘋果公司提交了一個關於這方面的錯誤報告,但是我想我會問這個問題,以防萬一我失去了一些明顯的東西。在Objective-C,下面呼叫能正常工作在64位系統上,但在32位的系統上拋出NSInvalidArgumentException:爲什麼setValue:forKey:在32位系統上失敗,但不是在64位?

[self setValue:@"true" forKey:@"flag"]; 

的 「標誌」 屬性是一個BOOL:

@property BOOL flag; 

此外,呼叫在夫特/ 32位,其中該屬性是布爾正常工作:

var flag: Bool = false 

類似地,這個調用中夫特正常工作在64位的系統上,但將引發NSInvalidArgumentException 32位的系統上(「不知疲倦x「是一個Int):

setValue("2", forKey: "index") 

然而,它在Objective-C/32位,其中屬性是一個NSInteger正常工作。

我會希望這些調用能夠正常工作,而不管語言或處理器體系結構如何。有沒有人有任何洞察他們爲什麼不可以?

+0

您發佈的代碼除了兩個字符串外沒有使用'BOOL'。您所發佈的代碼不會像您所描述的那樣導致任何錯誤。 – rmaddy

+0

你可以給它更多的代碼示例,它的工作原理和不起作用?正如@rmaddy指出的那樣,你的代碼沒有顯示BOOL。 – brandonscript

+0

「flag」屬性被定義爲BOOL。你不熟悉KVC嗎? –

回答

4

答案是那裏的意見,如果你把他們都...

setValue:forKey:需要原始類型屬性的NSNumber/NSValue,但你通常會傳遞一個。

觀察到的發佈不低於64位與32位,示例代碼也可能在64位系統上失敗。

這是所有下降到BOOL的性質,以及它是否是一個charbool,作爲意見建議 - 這取決於很多事情(在Xcode 6.4 10.10.5運行):

/// Type to represent a boolean value. 
#if !defined(OBJC_HIDE_64) && TARGET_OS_IPHONE && __LP64__ 
typedef bool BOOL; 
#else 
typedef signed char BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used. 
#endif 

setValue:forKey設置<類型的基本類型屬性>在任何傳遞的對象上調用- <type>Value

如果BOOLchar它調用- charValueNSString沒有這樣的方法 - 所以失敗。

如果BOOLbool它調用- boolValue,並NSString有這樣的一切都很好。

簡單的解決方法:

@property bool flag; 

而且應該到處並有額外的好處是flag總是是真/假,YES/NO,另一254點1/0的可能性,而不是一個那char可以。如果C的設計者沒有吝嗇,並且實際上從一開始就包含了一個真正的布爾類型,那麼將會有多麼不同呢?

+0

「setValue:forKey設置調用的原始類型屬性時 - Value對它傳遞的任何對象」 - 是否來自KVC文檔? –

+0

這似乎是正確的。從Apple的文檔:「... setValue:forKey:確定指定鍵的相應訪問器或實例變量所需的數據類型。如果數據類型不是對象,那麼使用適當的Value方法從傳遞的對象中提取值。「 –

+0

因此,這解釋了爲什麼BOOL被定義爲字符時會失敗,我仍不清楚爲什麼但是Swift Int失敗了,我不得不考慮一下(除非有人已經知道答案並且願意分享它) –

相關問題