簡體   English   中英

Objective-C / Cocoa:如何為readonly屬性設置值?

[英]Objective-C/Cocoa: How to set value for a readonly property?

我發現定義了一些對象,以便以某種方式由外部對象設置readonly屬性。 例如,在:

// skview is an instance of SKView
// skscene is an instance of SKScene
[skview presentScene:skscene]

skscene的'view'屬性是readonly,設置為skview。

如果屬性skview.view是readonly,這怎么可能? 如何在自定義對象中實現此行為?

謝謝!

如果在.h文件中聲明屬性並將其設置為readonly ,則可以在.m文件(在延續類別中)將其重新聲明為readwrite ,這樣您就可以直接編輯該值。

但這只是干凈的做事方式。 你也可以使用KVC更多關於它的后門,只需調用setValue:forKey:它繞過了你可能已經完成的任何好的東西來指定你想要公開的東西。

請查看此信息 ,了解KVC將如何處理您的請求。

然后,如果您真的絕望,可以使用Obj-C運行時直接訪問底層實例變量。

理解這一點的關鍵是要認識到“界面”和“實施”之間的根本區別。

@interface定義了您的特定對象想要呈現的PUBLICLY VISIBLE面。 對於外界,它可以聲明“此值是只讀的,您可能不會更改它”。

但是,在內部,實現可以自由地使其成為讀寫,直接訪問接口正在公開的后備存儲,或者將只讀屬性實現為計算,這不代表一個簡單的變量。

例如,想象一個名為'firstSubview'的屬性 - 這個只讀屬性將通過檢索所有子視圖的列表來實現,然后返回數組中的第一個(如果沒有則返回nil)。 使這個屬性可寫是沒有意義的。

請記住,@ implementation可以重新定義要讀寫的屬性,可以創建自己的私有屬性(和支持變量)等。

將.h文件的內容視為主要適用於所有人,除了實際的實現.m

如果您希望外部項目設置此屬性,則需要聲明一個setter。 例如,你的.h文件中有:

@property (readonly) NSString *mySpecialString;

-(void)setMySpecialString:(NSString*)string;

然后,您需要在.m文件中編寫實現,並且您可以在分配時放置您想要執行的任何其他操作。 但是,在這種情況下,將此屬性設置為只讀是沒有意義的,因為您可以讀取和寫入它。

使用只讀屬性的一種方法是使它們對外部類可讀,然后修改.m文件中相應的ivars,以便私有地寫入它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM