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 流程图

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?