You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于NSObject子类未实现setter却可通过performSelector设置属性的技术咨询

原理解析:为什么未手动编写setMethodProperty:却能通过performSelector:调用

这其实是Objective-C里**Key-Value Coding(KVC)**和编译器自动合成存取器的核心机制在起作用,我来给你拆解清楚:

  • 编译器自动合成存取方法:当你在NSObject子类A中声明了一个属性(比如@property (nonatomic, strong) id methodProperty;),即使你完全没有手动编写对应的setter和getter方法,Objective-C编译器会自动帮你完成三件事:

    1. 创建一个私有实例变量(默认命名为_methodProperty);
    2. 生成标准命名的setter方法-setMethodProperty:;
    3. 生成对应的getter方法-methodProperty。
      这些自动生成的方法属于类的私有方法,编译期不会暴露在头文件里,但在运行时是实实在在存在于类的方法列表中的。
  • performSelector:的运行时特性:performSelector:是NSObject提供的运行时方法,它会在程序运行时动态查找目标对象的方法列表,匹配对应的selector。不同于编译期的方法调用检查,它不要求方法在编译期可见(比如私有方法未在头文件声明),只要运行时存在这个selector,就能成功调用。这也是为什么你能通过它调用到编译器自动合成的setMethodProperty:。

  • 和KVC的关联:这种自动合成的命名规则(set<Key>:)正好符合KVC的标准setter命名规范。其实你直接使用KVC的[instance setValue:newValue forKey:@"methodProperty"]也能达到同样的属性赋值效果,本质上KVC内部也是优先查找符合命名规则的setter方法来完成赋值的。

内容的提问来源于stack exchange,提问作者Ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:57:31