2016-11-18 24 views
0

我有一個readonly對象屬性:是不是還好只讀對象上設置的屬性在Objective-C

@property (readonly) MyCustomController* customController; 

MyCustomerController有一個叫myCustomProperty

屬性是它好設置的屬性readonly對象?

self.customController.myCustomProperty = [CustomProperty new]; 

編譯器不抱怨,並在運行時的功能似乎是fine--它只是似乎有點不可思議,我可以設置一個readonly對象的屬性?
雖然技術上我猜我是「讀」屬性,然後設置屬性,所以我在技術上不設置實際的readonly屬性指針。

這是不好的做法嗎?任何事情都可能出錯?

根據Rypress

只讀屬性是一個簡單的方法,使屬性只讀。它 省略了setter方法,並通過點符號防止分配,但是 getter不受影響。例如,讓我們將我們的Car 界面更改爲以下內容。請注意,您可以通過用逗號分隔多個屬性來指定多個 屬性。

所以現在看來​​似乎不是一個問題,我只是想仔細檢查

回答

3

雖然技術上我想我「讀書」的屬性,然後設置它的屬性,所以我在技術上不設置實際的只讀屬性指針。

沒錯。它不是隻讀的對象,而是存儲對象引用的屬性。您無法更改屬性引用的對象,但您可以調用該對象上的方法和屬性來更改其狀態。

你在做什麼是完全正確和正常的。

1

請記住,屬性訪問的「點語法」只是用於調用存取方法的語法糖。所以,你的發言:

self.customController.myCustomProperty = [CustomProperty new]; 

時(假設訪問名稱尚未定製)從字面上等同於:

[[self customController] setMyCustomProperty:[CustomProperty new]]; 

請注意,你只呼籲customController屬性的getter。這就是屬性意味着所有的readonly屬性:有一個getter,但沒有setter。調用吸氣劑當然是完美的。除了聲明其類型外,該屬性不會影響您對檢索值所做的操作。

在任何一種形式,你可以分解成兩個獨立的步驟:

MyCustomController* controller = self.customController; 
controller.myCustomProperty = [CustomProperty new]; 

注意,customController屬性只參與了第一的線。第二個僅受controller類型爲MyCustomController*以及myCustomProperty(未示出)聲明影響。

另想情況:

// Some method on some class: 
- (void) doStuffWithCustomController:(MyCustomController*)controller; 

// Your code, in a completely different class: 
[foo doStuffWithCustomController:self.controller]; 

當然,你認識到-doStuffWithCustomController:可以做它接收到任何的有效期爲MyCustomController參考controller參數並不要緊,該基準是從哪裏來的。對?所以,它可以分配給controller.myCustomProperty而不用擔心。那麼,你也可以。

相關問題