关于NSObject子类未实现setter却可通过performSelector设置属性的技术咨询
原理解析:为什么未手动编写
setMethodProperty:却能通过performSelector:调用 这其实是Objective-C里**Key-Value Coding(KVC)**和编译器自动合成存取器的核心机制在起作用,我来给你拆解清楚:
编译器自动合成存取方法:当你在NSObject子类A中声明了一个属性(比如
@property (nonatomic, strong) id methodProperty;),即使你完全没有手动编写对应的setter和getter方法,Objective-C编译器会自动帮你完成三件事:- 创建一个私有实例变量(默认命名为
_methodProperty); - 生成标准命名的setter方法
-setMethodProperty:; - 生成对应的getter方法
-methodProperty。
这些自动生成的方法属于类的私有方法,编译期不会暴露在头文件里,但在运行时是实实在在存在于类的方法列表中的。
- 创建一个私有实例变量(默认命名为
performSelector:的运行时特性:performSelector:是NSObject提供的运行时方法,它会在程序运行时动态查找目标对象的方法列表,匹配对应的selector。不同于编译期的方法调用检查,它不要求方法在编译期可见(比如私有方法未在头文件声明),只要运行时存在这个selector,就能成功调用。这也是为什么你能通过它调用到编译器自动合成的setMethodProperty:。和KVC的关联:这种自动合成的命名规则(
set<Key>:)正好符合KVC的标准setter命名规范。其实你直接使用KVC的[instance setValue:newValue forKey:@"methodProperty"]也能达到同样的属性赋值效果,本质上KVC内部也是优先查找符合命名规则的setter方法来完成赋值的。
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

