将值分配给动态属性会导致崩溃

时间:2013-10-20 08:25:51

标签: iphone ios objective-c

这是我试图在这个程序中实现的内容

@interface settings : CBLModel

@property (copy) NSString* foo;

- (instancetype) initInDatabase: (CBLDatabase*)database withAllValues:(NSDictionary*)gameDic ChannelId:(NSString*)chann_id;

在.m文件中我正在使用此...

@implementation settings
@dynamic foo;

- (instancetype) initInDatabase: (CBLDatabase*)database
                  withAllValues: (NSDictionary*)gameDic ChannelId:(NSString*)chann_id
{
    NSParameterAssert(gameDic);
    self = [super initWithNewDocumentInDatabase: database];
    if (self) {
        self.foo=@"value";//this is where it crashes
    }
    return self;
}

-(void)setfoo:(NSString *)foo{
  foo=[foo copy];//tried doin this but the value is not assigned

}

我正在尝试设置导致崩溃的动态属性的值。我需要使用动态,因为我想在服务器上反映它并且使用synthesize不会那样做。

3 个答案:

答案 0 :(得分:2)

首先,您的属性采用小写foo和动态声明 大写Foo。这可能是导致问题的原因。但假设这个 只是一个错字,

@dynamic foo;

告诉编译器应该合成属性的getter和setter方法。 这是一个“承诺”,在运行时以某种方式提供所需的访问器方法。 由于您没有提供setter方法,

self.foo = @"abc";

必须在运行时崩溃。

因此,除非您有明确的理由,否则您可以删除@dynamic声明, 如有必要,编译器将合成getter,setter和instance变量。

如果你解释一下你想要达到的目标,可能会有更好的答案。

备注:如果您的自定义setFoo:进入无限循环,那么您可能会使用 setter方法中的属性setter,而不是直接访问实例变量。 一个简单的例子:

-(void)setFoo:(NSString *)foo
{
    // wrong: self.foo = [foo copy];
    _foo = [foo copy];
}

更新:上述答案是在我知道“设置”是子类之前写的。 来自“Couchbase Lite”的“CBLModel”。我没有使用该框架的经验,而是来自 阅读documentation在我看来@dynamic foo;在这种情况下确实是正确的, 并且setFoo: 应该在子类中实现,因为 Couchbase框架在运行时创建必要的访问器方法。

唯一可能的错误可以看到自定义初始值设定项应该调用

self = [self initWithNewDocumentInDatabase: database];

而不是

self = [super initWithNewDocumentInDatabase: database];

答案 1 :(得分:0)

尝试使用@property(copy) NSString* foo;

更改@property (nonatomic, strong) NSString *foo;

答案 2 :(得分:0)

@dynamic属性表示运行时某些底层代码将提供setter和getter的实现。它通常用于NSManagedObject的{​​{1}}子类。如果您的对象是Core Data的子类,则没有基础代码来管理您的@dynamic属性,因此您负责实现setter和getter。将NSObject更改为@dynamic,让编译器为您创建适当的setter和getter。

UPD:从最新的编译器开始,您可以省略@synthesize Martin R 说。