[英]Way to get information on whether or not a property is set readonly in objective-c
[英]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.