07.深入探究属性
@interface RYModel : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, assign) float height;
@property (nonatomic, strong) RYModel *father;
@property (nonatomic, assign) BOOL isBoy;
- (void)dosomething;
- (void)dosomethingWith:(NSString *)title;
+ (void)classDoSomething;
- (NSString *)sayMyName;
@end一、成员变量和属性
我们知道,属性会生成带下划线的成员变量和对应的set、get方法。我们将上面用到的RYModel,编译成C++看下。
8.1 copy 修饰符
name 属性用的是 copy 来修饰的。很容易发现它的set方法明显有不同。
他用的是 objc_setProperty ,而其他的都是直接通过内存平移对成员变量进行赋值操作。
二、objc_setProperty
我们看下 objc_setProperty 的源码:
发现他实际调用了 reallySetProperty
2.1 reallySetProperty
三、 Set 流程图

四、Type Encodings 类型编码
我们会看到这样一些 objc_selector,其中有 v24@0:8@16 类似这样的一些看不懂的字符串。他们叫类型编码
具体可以对照官方文档这里就不展开聊了
以 setName 为例分析一次:
v
24
@
0
:
8
@
16
返回值类型-void
占用大小-24
参数-id
从偏移量0开始
SEL
从偏移量8开始
参数-id
从偏移量16开始
Last updated
Was this helpful?