gpt4 book ai didi

iphone - 为动态属性赋值会导致崩溃

转载 作者:行者123 更新时间:2023-11-29 10:53:29 25 4
gpt4 key购买 nike

这就是我要在这个程序中实现的内容

@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];
}

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

能看到的唯一可能的错误是自定义初始化程序应该调用

self = [self initWithNewDocumentInDatabase: database];

代替

self = [super initWithNewDocumentInDatabase: database];

关于iphone - 为动态属性赋值会导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19475355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com