iOS开发之成员变量、实例变量、成员属性

发布时间 2023-09-10 18:45:41作者: 半个童钱

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