我开始学习如何在我的应用程序中使用核心数据,我有一个关于NSManagedObject
的setter和getter的问题。
在我的旧模型中,我使用以下语法来声明属性:
@interface MyModel : NSObject
{
MyAttributeOfClass *_myAttributeOfClass
}
- (void)setMyAttributeOfClass:(MyAttributeOfClass *)anAttributeOfClass;
- (MyAttributeOfClass *)myAttributeOfClass;
我知道,我可以用@synthesize
来做这些事情。但是,如果我使用具有公共属性的@synthesize
,如:
@property (nonatomic, strong) MyAttributeOfClass *myAttributeOfClass;
开发人员可以绕过我的setter,直接为myAttributeOfClass
设置一个值:myAttributeOfClass = bar;
。我不想允许这种行为,因为我使用setter来执行操作。如果不执行此操作,我的类将无法正常工作。
所以,现在我正在将我的旧模型迁移到从NSManagedObject
子类化的核心数据模型。
但是,当我从数据模型生成类时,属性是这样声明的:
@property (nonatomic, retain) MyAttribute *myAttribute;
因此,开发人员可以在不调用setter的情况下为该属性设置值:myAttribute=bar;我想禁止它。
有什么建议吗?
谢谢!
核心数据托管对象的属性不由实例变量备份。可以使用属性语法设置属性:
object.myAttribute = bar;
或带有键值编码:
[object setValue:bar forKey:@"myAttribute"];
在这两种情况下,setter方法
-(void)setMyAttribute:(MyAttribute *)value;
被调用。Setter和getter方法通常在运行时动态创建,但是可以提供自己的显式setter和/或getter方法。
但是,可以通过调用"基元"访问器方法绕过setter:
[object setPrimitiveValue:bar forKey:@"myAttribute"];
这是自定义setter方法将使用的方法,但任何人都可以调用基元访问器,没有办法抑制这种情况。
当我想要一个私有setter时,我的方法是在头中有这个:
@property (nonatomic, strong, readonly) NSString* myProperty;
然后在.m文件中添加:
@interface MyClass ()
@property (nonatomic, strong) NSString* myProperty;
@end
从外部看,该属性是只读的,但通过在实现文件中定义专用类别,该属性在实现中是可读写的。