Iphone 具有动态特性的点表示法

Iphone 具有动态特性的点表示法,iphone,objective-c,ipad,Iphone,Objective C,Ipad,我有以下用于核心数据存储的类 @interface CVMessage : NSManagedObject { NSString * message; } @property (nonatomic, retain) NSNumber * date_created; @property (nonatomic, retain) NSString * message; @property (nonatomic, retain) NSNumber * mid; @property (nonat

我有以下用于核心数据存储的类

@interface CVMessage : NSManagedObject {
    NSString * message;
}

@property (nonatomic, retain) NSNumber * date_created;
@property (nonatomic, retain) NSString * message;
@property (nonatomic, retain) NSNumber * mid;
@property (nonatomic, retain) CVLogin * creator;
@property (nonatomic, retain) NSSet * stars;
@property (nonatomic, retain) NSSet * embeds;
@property (nonatomic, retain) CVTopic * topic;
@property (nonatomic, assign) BOOL options;

@end

@implementation CVMessage
@synthesize options;
@dynamic message;
@dynamic mid;
@dynamic creator;
@dynamic date_created;
@dynamic embeds;
@dynamic stars;
@dynamic topic;
我希望能够做到以下几点:

CVMessage*mes=[CVMessage new]; mes.message=@“一些文本”

我的直觉是,我必须为此实现自己的setter,因此我:

-(void)setMessage:(NSString *) newMessage
{
    if (self.message != newMessage)
    {
        [self.message release];
        [newMessage retain];
        self.message = newMessage;
    }
}

当我运行它时,这会给我一个错误。我遗漏了什么吗?

self.message=newMessage
[self-setMessage:newMessage]
相同,因此可能会出现无限递归,错误可能是堆栈溢出

只需直接访问变量:

-(void)setMessage:(NSString *) newMessage
{
    if (self.message != newMessage)
    {
        [message release];
        message = [newMessage retain];
    }
}

self.message=newMessage
[self-setMessage:newMessage]
相同,因此您可能在那里得到无限递归,并且错误可能是堆栈溢出

只需直接访问变量:

-(void)setMessage:(NSString *) newMessage
{
    if (self.message != newMessage)
    {
        [message release];
        message = [newMessage retain];
    }
}

我也要这么说。还有一件事:我认为通常应该复制NSString属性,而不是保留。我一开始尝试过,但出现了错误:未能调用NSManagedObject类“CVMessage”-[CVMessage message]上指定的初始值设定项:发送到实例0xdb405a0的未识别选择器***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CVMessage message]:第一次抛出时发送到实例0xdb405a0的未识别选择器'***调用堆栈:就生成的代码而言,这两个方法表达式Emilio之间没有区别。
self.message=
确实使用了
setMessage:
,但是您可以通过
message=
self->message=
直接访问ivar。有人想对我在实现上述功能时遇到的错误发表评论吗?我也会这么说。还有一件事:我认为通常应该复制NSString属性,而不是保留。我一开始尝试过,但出现了错误:未能调用NSManagedObject类“CVMessage”-[CVMessage message]上指定的初始值设定项:发送到实例0xdb405a0的未识别选择器***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CVMessage message]:第一次抛出时发送到实例0xdb405a0的未识别选择器'***调用堆栈:就生成的代码而言,两个方法表达式Emilio之间没有区别。
self.message=
确实使用了
setMessage:
,但您可以通过
message=
self->message=
直接访问ivar。有人对我在实现上述操作时遇到的错误发表评论吗?