继承属性,从 readonly 继承的属性中读写时不会合成 setter

2024-05-27

我在使用属性时发现了一个奇怪的行为,该属性被继承为只读,然后在继承的类中重新声明为读写

In A.h

@interface A : NSObject

@property (nonatomic, strong, readonly) NSObject * someProperty;

@end

In B.h

@interface B : A

// no matter if here
// @property (nonatomic, strong, readwrite) NSObject * someProperty;

- (void)foo;

@end

In B.m

@interface B()

// no matter if here
@property (nonatomic, strong, readwrite) NSObject * someProperty;

@end

@implementation B

- (void)foo {

    NSLog(@"%@", self.someProperty);

    // crash here with unrecognized selector setSomeProperty:
    self.someProperty = [NSObject new];
}

@end

calling

self.someProperty = [NSObject new];

导致代码在无法识别的选择器“setSomeProperty:”上崩溃

调查显示,即使声明为读写,设置器似乎也没有被合成

为什么会发生这种情况?编译器没有指示任何发生这种情况的警告,我也没有在任何记录此行为的地方找到


Add a @synthesize指令到 B.m 文件,崩溃就会消失:

@synthesize someProperty = _someProperty;

问题是,因为在父类中您将属性声明为readonly没有为其合成设置器。并且子类继承了这种行为。即使您重新声明该财产readwrite在子类中。 这@synthesize命令将指示编译器再次生成类 B 的访问器方法。

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

继承属性,从 readonly 继承的属性中读写时不会合成 setter 的相关文章

随机推荐