我面临一项需要帮助的架构决策。

我正在创建一个供多个客户端使用的库。在这个库中,我有一个名为LibClass的类,具有一个名为aProperty的读写属性,还有一个名为LibManager的类,其中包含对Libclass实例的引用。 LibManager负责更新LibClass属性。

客户端可以通过LibClass上的方法获取LibManager实例,我们将其称为getLibClassInstanceMethod

我不希望我的客户能够在aProperty中更改LibClass,因为这意味着客户可以更改我的库模型。我只希望LibManager可以更改aProperty的访问权限。

我一直在考虑几种解决方案:

选项1
getLibClassInstanceMethod内部返回对象的深层副本。

优点:
我始终确保只有库对模型具有完全访问权限。

缺点:
内存消耗-每次我想要获取对象时,都需要克隆它。

选项2

使LibClass不可变;每次我想更改类属性时,都需要创建一个新类,并在指定的initializer(constructor)中传递新值并销毁旧对象。

优点:
我使 class 变得一成不变,这正是我想要的

缺点:
当类变大时,总是仅由于一个属性更改而总是重新创建类有点奇怪。

选项3

创建某种可变/不可变对,例如NSString / NSMutableString。

优点:
不确定

缺点:
对于每个 class ,需要有两个对应的 class ,使 class 数量增加一倍。

我真的不确定该走哪条路。你会怎么做?

谢谢

最佳答案

如杰夫所说,做到这一点的一种方法。

在界面的LibClass.h中:

@property (strong, readonly) id aProperty;

在新文件LibClassPrivate.h中:
@interface LibClass ()
@property (strong, readwrite) id aPropertyWritable;
@end

在LibClass.m中:
@implementation LibClass{
    id _aProperty;
}

- (id) aProperty{
    return [_aProperty copy];
}

- (void) setAPropertyWritable: (id) aPropertyWritable {
    _aProperty = aPropertyWritable;
}
- (id) aPropertyWritable{
    return _aProperty;
}
@end

基本上,我们有两个属性。两者都由一个实例变量支持。我们 public 标头中显示的那个只能返回ivar的副本。在我们的 private 标头中显示的那个可以读写ivar。任何需要使用读取和写入访问器的类都可以将 private 标头#import到其.m文件中。

只需确保_aProperty对象的任何类型都实现了copyWithZone:。

顺便说一句,甚至苹果公司都提到了这种方法。

如果您打算将“ private ”方法或属性提供给
选择其他类,例如框架中的相关类,
可以在单独的头文件中声明类扩展名并导入
在需要它的源文件中。有两个是很常见的
类的头文件,例如XYZPerson.h和
XYZPersonPrivate.h。发布框架时,您仅发布
public XYZPerson.h头文件。

10-06 01:17