本文将会深入底层探究@property的本质。
在进入正题之前,先介绍一个clang编译器的命令
clang -rewrite-objc main.m
这个命令用于clang重写.m文件为.cpp文件。
@property深入代码理解
我们都知道
@preperty = ivar + getter + setter
ivar 就是实例变量,编译器会帮助我们自动生成名字为 ‘_属性名’这样的实例变量,同时也会自动生成getter和setter方法。
有如下代码
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic,copy) NSString* name
@property (nonatomic,assign) NSUInteger age
@end
@implementation Person
@systhesize name = _name;
@systhesize age = _age;
@end
int main(int arc , const char *argv[]) {
@autorereleasepool{
Person *p = [[Person alloc] init];
p.name = @"tingting";
p.age = 18
}
return 0;
}
使用上述命令生成的.cpp文件中可以查找到如下部分的代码
#ifndef _REWRITER_typedef_Person
#define _REWRITER_typedef_Person
typedef struct objc_object Person;
typedef struct {} _objc_exc_Person;
#endif
extern “C” unsigned long OBJC_IVAR_
Person
P
e
r
s
o
n
_name;
extern “C” unsigned long OBJC_IVAR_
Person
P
e
r
s
o
n
_age;
struct Person_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *_name;
NSUInteger _age;
};
//@property (nonatomic,copy) NSString* name;
//@preperty (nonatomic,assign) NSUInteger age