这就是我想在这个程序中实现的内容
@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
}
我正在尝试设置导致崩溃的动态属性的值。我需要使用动态,因为我想将其反射(reflect)在服务器上,而使用合成则无法做到这一点。
最佳答案
首先,你的属性是小写的foo
,并且动态声明
为大写 Foo
。这可能是导致问题的原因。但假设这
只是一个错字,
@dynamic foo;
告诉编译器它不应该为属性合成 getter 和 setter 方法。 这是一个“ promise ”,所需的访问器方法将以某种方式在运行时提供。 由于您没有提供 setter 方法,
self.foo = @"abc";
必须在运行时崩溃。
因此,除非您有明确的理由,否则您可以删除 @dynamic
声明,
如果需要,编译器将合成 getter、setter 和实例变量。
如果您解释一下您想要实现的目标,可能会得到更好的答案。
备注:如果您的自定义 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];
关于iphone - 为动态属性赋值会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475355/