//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
复制代码
概念理解
- 成员变量:类的定义或者类的实现中,在{ }中所声明的变量都为成员变量。如arr、count、name
- 实例变量:是一种特殊的成员变量,实例变量本质上就是成员变量,只是实例是针对类而言,实例是指类的声明,如果成员变量的类型是类类型,那么这样的成员变量就是实例变量,实例变量只能在类的内部访问,外部无法访问到
- 属性:为方便类对象通过点语法访问了属性, 属性创建过程中自动产生了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方法
总结:
实例变量+基本数据类型变量=成员变量
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END