属性和成员变量的区别有很多的帖子都讲了,有兴趣大家可以去看一看。我就简略的说一下,属性就是在编译器的帮助下自动生成_属性名的成员变量和setter、getter方法,成员变量需要自己去书写,具体写法大家可以百度。这里我主要是从runtime的角度,查看在类中,它们到底有什么区别。直接上代码
1.创建一个Person类
@interface Person : NSObject
{
NSString *sex;
}
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) int age;
@end
2.分别获取变量列表、属性列表、方法列表,对比它们的区别
2.1 先查看变量列表
- (void)test_IvarList {
unsigned int count;
Ivar *varA = class_copyIvarList([Person class], &count);
for (unsigned int i=0; i<count; i++) {
Ivar v = varA[i];
const char *name = ivar_getName(v);
const char *cls = ivar_getTypeEncoding(v);
NSLog(@"----%s----",name);
NSLog(@"----%s----",cls);
}
}
2.2查看属性列表
- (void)test_PropertyList {
unsigned int count;
objc_property_t *propertyArray = class_copyPropertyList([Person class], &count);
for (unsigned int i=0; i<count; i++) {
objc_property_t property = propertyArray[i];
const char *name = property_getName(property);
const char *cls = property_getAttributes(property);
NSLog(@"----%s----",name);
NSLog(@"----%s----",cls);
}
}
2.3 查看方法列表
- (void)test_MethodList {
unsigned int count;
Method *methods = class_copyMethodList([Person class], &count);
for (int i = 0; i < count; i++) {
Method method = methods[i];
SEL selector = method_getName(method);
NSString *name = NSStringFromSelector(selector);
NSLog(@"method_getName:%@",name);
}
}
这样对比一下就很清楚了,属性是有setter和getter的,并且属性存储在PropertyList 中。成员变量是不会生成setter和getter的,它只存储在成员变量中。编译器会为属性生成一个_属性名的成员变量。以上