2016-05-12 74 views
1

是什麼基本的Objective-C語法

cell.classHour.backgroundColor=[UIColor blackColor]; 

[cell.classHour setBackgroundColor:[UIColor blackColor]]; 

之間的區別正如你看到的,我是想設定在一個UITableViewCell一個UILabel的背景顏色。不知何故,第一種方法並不適合我。我一直認爲這兩種方法都會做同樣的事情。

+0

您可能應該解釋第一種方法不適用於您的方式。 –

回答

3

TL; DR:

兩條線有99.5%的相同的結果。

之間有什麼區別[...]

的語義差別很微妙。在幾乎所有情況下,編譯的可執行文件都沒有區別。

第一行使用屬性語法使編譯器查找匹配的屬性聲明。如果沒有找到的話,會查找匹配的二傳手聲明:

- (void)setBackgroundColor:(UIColor *)value; 

編譯器將仍然接受點符號,當它找到一個匹配的制定者。

即使有一個(默認)財產申報...

@property UIColor *backgroundColor; 

...編譯器只是插入到setBackgroundColor:的調用,如財產申報意味着這個名字的setter存在。

我一直以爲這兩種方法都會這麼做的。

只要在編譯時知道接收器的靜態類型,點符號和顯式調用setter就是相同的。如果接收器的靜態類型是id,編譯器將不允許點符號。

時,有一個財產申報與明確的二傳手名兩種風格之間的唯一真正的區別就出現了:

@property (setter=setColor) UIColor *backgroundColor; 

在此(假設)的情況下,編譯器將實際產生的兩行不同的代碼: setColor:使用屬性語法時,setBackgroundColor:使用顯式消息發送時。

不知何故,第一種方法並沒有爲我工作。

最後一部分可能不是你的問題的原因。我添加它來指出消息發送和屬性訪問中的唯一區別。

雖然改變吸氣名字是常見的(布爾屬性)也很少使用顯式二傳手名。我從未在蘋果的框架中看到過這一點。

+0

這是正確的答案。唯一缺少的是[鏈接](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html)到Apple文檔。 – Vin

-1

這兩個都指向相同的api。一個機會可能是一個操作系統錯誤,請檢查您正在測試的操作系統,並在其他版本中測試。