从自制模型到核心数据模型的迁移:setter/getter问题



我开始学习如何在我的应用程序中使用核心数据,我有一个关于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

从外部看,该属性是只读的,但通过在实现文件中定义专用类别,该属性在实现中是可读写的。

相关内容

最新更新