我面临一项需要帮助的架构决策。
我正在创建一个供多个客户端使用的库。在这个库中,我有一个名为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头文件。