OC学习33:成员变量、实例变量和属性变量的区别探索

张建 lol

成员变量和实例变量

1
2
3
4
5
@interface ViewController : NSViewController{
id data; // 实例变量
int a; // 成员变量
NSString * name; // 实例变量
}
  1. 成员变量:在{ }中声明的变量都是成员变量;
  2. 实例变量:实例变量是一种特殊的成员变量,只是实例是针对类而言,实例是指类的声明;
  3. 因此上面的data是实例变量,a是成员变量,name是实例变量。

  1. 总结:
  • 成员变量是定义在{ }号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量;
  • 成员变量用于内部,无需与外界接触的变量,因为成员变量不会生成set、get方法,所以外界无法与成员变量接触;
  • 实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。

属性

1
2
3
@interface ViewController : 
//属性
@property (nonatomic,copy)NSString * sex;
  1. 属性 = Ivar(实例变量) + Setter方法 + Getter方法。
  2. 属性变量的好处就是允许让其他对象访问到该变量,因为属性创建过程中自动产生了set方法和get方法;当然,你可以设置只读或者可写等,设置方法也可自定义。
  3. 例子:

代码如下:

1
2
3
@interface Student : NSObject ()   
@Property (nonatomic, copy) NSString *name;//声明属性
@end

通过 class_copyMethodList 查看类里面的所有实例方法

1
2
3
4
5
6
7
8
9
10
unsigned int   methodCount;
NSMutableArray *methodList = [NSMutableArray array];
Method *methods = class_copyMethodList([self class],&methodCount);
for(int i =0; i < methodCount; i++){
SEL name = method_getName(methods[i]);
NSString *strName = [NSString stringWithCString:sel_getName(name) encoding:NSUTF8StringEncoding];
[methodList addObject: strName];
}
free(methods);
NSLog(@"方法列表:%@",methodList);

结果如下:

1
方法列表:( ".cxx_destruct", name, "setName:" )

利用 class_copyIvarList 查看类里面的成员变量(实例变量)

1
2
3
4
5
6
7
8
9
10
unsigned int   numberOfIvars = 0;
NSMutableArray *ivarList = [NSMutableArray array];
Ivar *ivars = class_copyIvarList([self class], &numberOfIvars);
for (int i = 0; i < numberOfIvars; i++) {
Ivar ivar = ivars[i];
NSString *ivarName = [NSString stringWithUTF8String: ivar_getName(ivar)]; //获取成员变量的名称
[ivarList addObject: ivarName];
}
free(ivars);
NSLog(@"实例变量列表:%@", ivarList);

结果如下:

1
_name

使用 class_copyPropertyList 查看类的所有属性

1
2
3
4
5
6
7
8
9
unsigned int   count;
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for(unsignedinti =0; i< count; i++){
constchar*name = property_getName(propertyList[i]);
objc_property_t property = propertyList[i];
const char*a = property_getAttributes(property);
NSLog(@"%@的属性信息__%@",[NSString stringWithUTF8String:name], [NSString stringWithUTF8String:a]);
}
free(propertyList);

结果如下:

1
name属性信息__T@"NSString",C,N,V_name

T@”NSString”,C,N,V_name这一堆的字母信息是这样的情况:

  • T:类型;
  • C:copy修饰符;
  • N:nonatomic;
  • V:实例变量;
  • R:readonly修饰符;
  • &:retain修饰符;

@property和@synthesize

  1. @synthesize 让编译器自动生成 settergetter,可以制定属性对应的成员变量。
  2. @dynamic 告诉编译器,属性的 settergetter 方法由用户自己实现,不自动生成。
  • Post title:OC学习33:成员变量、实例变量和属性变量的区别探索
  • Post author:张建
  • Create time:2020-07-20 15:30:21
  • Post link:https://redefine.ohevan.com/2020/07/20/OC/OC学习33:成员变量、实例变量和属性变量的区别探索/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
On this page
OC学习33:成员变量、实例变量和属性变量的区别探索