首页 > 如果property定义了setter但未实现,依然可以赋值,想询问一下这个机制是否可靠

如果property定义了setter但未实现,依然可以赋值,想询问一下这个机制是否可靠

有个问题想交流一下
我定义一个属性

@property (nonatomic, setter=_set_name:) NSString *Name;

使用默认 @synthesize 进行实现
但是我没有实现_set_name:方法,系统也能通过.name进行正确赋值,而不是调用resolveInstanceMethod查询未实现方法。感觉是默认分配一个KVC方法赋值。
这个副作用是否可靠,有没有相关的资料


当你在property中使用setter指定了一个你自定义的set方法后,你会发现原来的setName:(就那你的name来说)方法已经不存在了,即当调用[xxx setName:@"name"] 时编译器会报错。

然后,你可以在你的类中实现_set_name: 方法,你会发现,当你使用xxx.name进行赋值的时候,实际上是使用了_set_name:来赋值,而不是原来的setName: 方法了。


测试
以题主提到的Name为例,构建一个最简单的类,如下

@interface TestObjLib : NSObject
@property NSString *Name;

@end

将这个类放入一个静态库工程中,编译,用nm打印出编译出的.o文件信息

nm TestObj.a

结果如图

将TestObj的属性修改一下,如下

@interface TestObjLib : NSObject
@property (nonatomic, setter=_set_name:) NSString *Name;

@end

再次编译,执行nm命令,结果如下图

Conclusion
property的机制是在编译期自动生成setter和getter,若手动指定了setter的名称,但未实现方法,则编译器就根据指定的名称来生成setter。若未指定,则编译器以默认规则生成setter,通常来说,为setXXX:。

以上。

补充,以上demo说明二流的回答是正确的。

【热门文章】
【热门文章】