成员变量和实例变量
1 2 3 4 5
| @interface ViewController : NSViewController{ id data; // 实例变量 int a; // 成员变量 NSString * name; // 实例变量 }
|
- 成员变量:在{ }中声明的变量都是成员变量;
- 实例变量:实例变量是一种特殊的成员变量,只是实例是针对类而言,实例是指类的声明;
- 因此上面的data是实例变量,a是成员变量,name是实例变量。
- 总结:
- 成员变量是定义在{ }号中的变量,如果变量的数据类型是一个类则称这个变量为实例变量;
- 成员变量用于内部,无需与外界接触的变量,因为成员变量不会生成set、get方法,所以外界无法与成员变量接触;
- 实例变量是成员变量的一种特殊情况,所以实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。
属性
1 2 3
| @interface ViewController : //属性 @property (nonatomic,copy)NSString * sex;
|
- 属性 = Ivar(实例变量) + Setter方法 + Getter方法。
- 属性变量的好处就是允许让其他对象访问到该变量,因为属性创建过程中自动产生了set方法和get方法;当然,你可以设置只读或者可写等,设置方法也可自定义。
- 例子:
代码如下:
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);
|
结果如下:
使用 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
@synthesize
让编译器自动生成 setter
和 getter
,可以制定属性对应的成员变量。
@dynamic
告诉编译器,属性的 setter
与 getter
方法由用户自己实现,不自动生成。