这是我试图在这个程序中实现的内容
@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不会那样做。
答案 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 说。