iOS成员变量、实例变量、成员属性说明
1、成员变量、实例变量:
1)、成员变量是在{}中声明的变量,如下代码所示:
2)、如果成员变量的类型是一个类则称这个变量为实例变量
3)、成员变量包括实例变量,所以可以通称为成员变量(这里只是便于概念理解分开解释)
实例变量 = 成员变量 = ivar
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Persion : NSObject{
NSString *name; //实例变量
int age; //成员变量
}
@end
NS_ASSUME_NONNULL_END
2、成员属性(也可称属性变量):
通常我们使用@property声明的变量都叫做成员属性,也可称属性变量。
3、成员变量和成员属性的关系:
1、属性对成员变量扩充了存取方法 (例如在get和set方法中做其他逻辑);
2、属性默认会生成带下划线的成员变量 ;
3、但只声明了变量,是不会有属性的,可以通过以下代码证明:
在Person.h 头文件中
@interface Person : NSObject {
@private
//name为私有成员变量
NSString *name;
}
// age 为成员属性
@property (nonatomic ,copy) NSString *age;
在viewController.m 中,通过RunTime机制获得对象的所有成员变量和成员属性。
Person *p = [Person new];
unsigned int count = 0; //count记录变量的数量
// 获取类的所有成员变量
Ivar *members = class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = members[i];
// 取得变量名并转成字符串类型
const char *memberName = ivar_getName(ivar);
NSLog(@"变量名 = %s",memberName);
}
// 获取类的所有成员属性
objc_property_t *properties =class_copyPropertyList([Person class], &count);
for (int i = 0; i<count; i++)
{
objc_property_t property = properties[i];
const char* char_f =property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:char_f];
NSLog(@"属性名 = %@",propertyName);
}
打印结果为
变量名 = name
变量名 = _age
属性名 = age