你要知道的@property都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/64443487
上一篇文章[iOS @property探究(一):基础详解](http://blog.csdn.net/u014205968/article/details/64443443
)介绍了@property的基本原理和使用方法,以及相关修饰符详解。
本文将会深入底层探究@property的本质。
在进入正题之前,先介绍一个clang
编译器的命令
clang -rewrite-objc main.m
这个命令用于clang
重写.m文件
为.cpp文件
。
@property深入代码理解
我们都知道
@property = ivar + getter + setter
ivar
就是实例变量,编译器会帮我们自动生成名字为'_属性名'
这样的实例变量,同时也会自动生成getter
和setter
方法。
有如下代码
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy) NSString* cjmName;
@property (nonatomic, assign) NSUInteger cjmAge;
@end
@implementation Person
@synthesize cjmName = _cjmName;
@synthesize cjmAge = _cjmAge;
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
p.cjmName = @"JIaming Chen";
p.cjmAge = 22;
}
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$_cjmName;
extern "C" unsigned long OBJC_IVAR_$_Person$_cjmAge;
struct Person_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *_cjmName;
NSUInteger _cjmAge;
};
// @property (nonatomic, copy) NSString* cjmName;
// @property (nonatomic, assign) NSUInteger cjmAge;
/* @end */
// @implementation Person
// @synthesize cjmName = _cjmName;
static NSString * _I_Person_cjmName(Person * self, SEL _cmd) { return</