2012-09-27 37 views
2

在我的Objective-C應用程序中,我有一個構成模型的NSObject的子類的層次結構。這些對象本身沒有功能,即它們只有屬性,其唯一目的是保存數據。此外,我有一個管理該層次結構(樹)的實例的控制器。Objective-C中的只讀分層模型

只允許該控制器對樹進行更改(例如樹中對象的屬性)。程序的其他部分應該對(整個)樹具有隻讀訪問權限。

完成此類訪問管理的最簡單方法是什麼?

回答

3

這是friend classes的典型案例。儘管ObjC沒有朋友班的語言支持,但他們並不難創建。

首先,你的模型的公共接口應該聲明屬性readonly。這部分應該是顯而易見的。

然後在模型內部,根據需要在類擴展中使您的屬性爲readwrite。 (如果你習慣了ObjC,這應該也很明顯;如果它不明顯,我會更新答案。)

現在剩下的故事。創建一個「朋友」類別(或「作家」或「受保護」或任何對您有意義的名字)。

@interface ModelObject (Friend) 
- (void)setSomeProperty:(id)someProperty; 
@end 

這只是告訴任何人誰進口這個類別setSomeProperty:存在。現在你的控件將導入這個文件(ModelObject+Friend.h),並且可以設置屬性。其他人都會進口ModelObject.h,並且該屬性看起來是隻讀的。

這適用於任何你需要訪問的東西,當然不只是屬性。我經常創建不可變的類,然後創建一個「僅限朋友」的方法。

+0

很好的答案,謝謝!它在技術上是有效的,我看到它。但它本質上也意味着將模型定義代碼乘以三倍。我正在尋求一個更優雅的解決方案(比如像在控制器定義中的@ deep-readonly限定符將會很好。:-))我想知道是否有人想出了更優雅的解決方案。 – ilmiacs

+0

再次想到,這也不是我想要達到的。其他類應該只讀訪問由控制器管理的樹。但是,只要它們不修改控制器託管樹中的對象,它們應該可以自由地在樹中創建模型對象的私有副本或創建它們自己的模型對象實例。我覺得控制器應該負責採取保護措施。模型是愚蠢的。這應該反映在代碼中。 – ilmiacs

+0

我不確定如何在代碼中反映「愚蠢」。如果你的目標是有可變和不可變的數據對象,你可以使用mutable子類來創建不可變對象,使用'copy'和'immutableCopy'等接口來管理它們(如NSString和NSMutableString)。然而,ObjC與C++的「const」沒有相同之處。你不能使用調用者不能混淆的限定符返回一個可變對象。你只能通過複製來實現這一點。然而,在大多數情況下,我發現這些擔憂表明一個過於複雜的模型層次結構。核心數據最好管理複雜模型。 –