iOS 中什么是成员变量、什么是属性、什么是实例变量

//JSPerson.h文件
@interface JSPerson : NSObject{
    NSArray* arr;
    int count;
    NSString* name;
}
@property (nonatomic, copy) NSString* nickName;
@property (nonatomic, assign) int age;
@property (nonatomic, strong) NSDictionary *dic;
@end
复制代码

概念理解

  1. 成员变量:类的定义或者类的实现中,在{ }中所声明的变量都为成员变量。如arr、count、name
  2. 实例变量:是一种特殊的成员变量,实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明,如果成员变量的类型是类类型,那么这样的成员变量就是实例变量,实例变量只能在类的内部访问,外部无法访问到
  3. 属性:为方便类对象通过点语法访问了属性, 属性创建过程中自动产生了setter 和getter方法和带下划线的成员变量。可以设置只读或者可写等,设置方法也可自定义。属性是用于提供外部访问的变量。
extern "C" unsigned long OBJC_IVAR_$_JSPerson$_nickName;
extern "C" unsigned long OBJC_IVAR_$_JSPerson$_age;
extern "C" unsigned long OBJC_IVAR_$_JSPerson$_dic;
struct JSPerson_IMPL {
	struct NSObject_IMPL NSObject_IVARS;
	NSArray *arr;
	NSMutableArray *arr2;
	int count;
	NSString *name;
	int _age;
	NSString * _Nonnull _nickName;
	NSDictionary * _Nonnull _dic;
};

// @property (nonatomic, copy) NSString* nickName;
// @property (nonatomic, assign) int age;
// @property (nonatomic, strong) NSDictionary *dic;
/* @end */

#pragma clang assume_nonnull end

// @implementation JSPerson

static NSString * _Nonnull _I_JSPerson_nickName(JSPerson * self, SEL _cmd) { return (*(NSString * _Nonnull *)((char *)self + OBJC_IVAR_$_JSPerson$_nickName)); }
extern "C" __declspec(dllimport) void objc_setProperty (id, SEL, long, id, bool, bool);

static void _I_JSPerson_setNickName_(JSPerson * self, SEL _cmd, NSString * _Nonnull nickName) { objc_setProperty (self, _cmd, __OFFSETOFIVAR__(struct JSPerson, _nickName), (id)nickName, 0, 1); }

static int _I_JSPerson_age(JSPerson * self, SEL _cmd) { return (*(int *)((char *)self + OBJC_IVAR_$_JSPerson$_age)); }
static void _I_JSPerson_setAge_(JSPerson * self, SEL _cmd, int age) { (*(int *)((char *)self + OBJC_IVAR_$_JSPerson$_age)) = age; }

static NSDictionary * _Nonnull _I_JSPerson_dic(JSPerson * self, SEL _cmd) { return (*(NSDictionary * _Nonnull *)((char *)self + OBJC_IVAR_$_JSPerson$_dic)); }
static void _I_JSPerson_setDic_(JSPerson * self, SEL _cmd, NSDictionary * _Nonnull dic) { (*(NSDictionary * _Nonnull *)((char *)self + OBJC_IVAR_$_JSPerson$_dic)) = dic; }
// @end
复制代码

可以看到,_I_JSPerson_nickName,_I_JSPerson_setNickName_对应的就是属性nickName的setter、getter方法,而成员变量则不会生对应的setter、getter方法

总结:
实例变量+基本数据类型变量=成员变量

引用: iOS -成员变量、实例变量、属性

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享