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

标签 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

}

我正在尝试设置导致崩溃的动态属性的值。我需要使用动态,因为我想将其反射(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/

相关文章:

iphone - Float 不可转换为 CGFloat,CGFloat 不可转换为 Float

iphone - 我可以在 Iphone 中制作图表吗?使用任何框架

ios - 如何从 Parse 中获取随机行?

ios - 调用方法但不更新 UI

ios - 开始在后台播放声音 IOS 7

iphone - 如何使用 NSURLConnection 取消持久连接?

ios - 将 UnsafeMutablePointer<UInt8> 转换为字符串时堆缓冲区溢出

ios - 新任务不等待GCD Barriers

ios - 使用 Objective-C 中的 Swift ObservableObject 时出现链接器错误

iphone - 将 Linphone 应用程序集成到我的 iOS 应用程序