2014-01-13 88 views
0

使用Xcode5與ARC,我創建一個屬性的布爾:認識布爾屬性

@property (nonatomic) BOOL done; 

比我使用它與self.done

問題是,有時我會在使用它的時候出現錯誤。例如(錯誤):

//implicit conversion of bool to id disallowed in-ARC 
[encoder encodeObject:self.done forKey:@"text"]; 

在這種情況下,我有兩個問題: 1.當我爲什麼要創建一個屬性與BOOL,什麼是背後的邏輯呢? 2.爲什麼我得到這個錯誤?

+2

不是說它對你的問題有所不同,它更多的是對約定的建議。對於BOOL屬性,getters通常是'isDone',所以我會這麼做'@property(nonatomic,getter = isDone)BOOL done;'只是一個建議,更像是Objective-C約定。 – Popeye

+0

非常感謝,我學到了一些東西。 – Curnelious

+0

@Popeye感動了一個好點。忘了那:)。當這個社區喜歡完成彼此時,我感到很高興:p –

回答

3

問題2

你得到的是錯誤,因爲BOOL基本類型和編碼器期望的對象。您可以輕鬆地解決這個包裹你的布爾與文字,像這樣

[encoder encodeObject:@(self.done) forKey:@"text"] 

這基本上convertes到:

[encoder encodeObject:[NSNumber numberWithBool:self.done] forKey:@"text"] 

問題1

您可以BOOL創建一個屬性,因爲它更直接的是NSNumberBOOL開始。舉例來說,如果你想用NSNumber這個布爾值,你需要一直做number.boolValue

聲明一個屬性與聲明一個iVar的優點是它爲您提供了一個KVO就緒結構,並且您有一個入口點來獲取值和設置值的入口點。在BOOL的情況下,這主要用於調試。雖然KVO也是一個加號:)(If you need more info on properties vs iVars follow my answer on SO

+0

那麼,爲什麼不只是設置一個布爾值作爲實例變量沒有屬性? – Curnelious

+0

這是另一個問題,幸運的是我給出了一個答案 - http://stackoverflow.com/questions/20860078/benefits-of-using-setter-and-getter-methods-vs-direct-manipulation/20860304#20860304 。我希望它可以回答你:p –

1

正如你在

[encoder encodeObject:self.done forKey:@"text"]; 

done看到encodeObject:不是一個Objective-C的對象。相反,它是一個BOOL。

BOOL是typedef signed char BOOL;

你不能框中BOOL類型的OBJ-C對象作爲NSNumber和編碼。

[encoder encodeObject:@(self.done) forKey:@"text"]; 
+0

所以使bool的屬性不會使他成爲一個對象? 。所以我如何編碼呢? – Curnelious

+1

編號屬性可以是基元或對象。編碼將bool轉換爲對象。正如我寫的那樣使它成爲'NSNumber'。 –

+0

保存爲'NSNumber'例如:'[NSNumber numberWithBool:self.done]' –