2012-09-27 23 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”没有相同之处。你不能使用调用者不能混淆的限定符返回一个可变对象。你只能通过复制来实现这一点。然而,在大多数情况下,我发现这些担忧表明一个过于复杂的模型层次结构。核心数据最好管理复杂模型。 –