1.概述
一个类中的成员分为两种:数据成员和函数成员。现在来讲讲数据成员吧!
数据成员:用于描述对象的状态。它分为:属性、实例变量。
2.属性
2.1.属性表达的是对象的状态,在接口头文件中定义。
@property (copy)NSString* name;
在编译时,会在实现类中自动生成对应的实例变量,以及供外部访问的setter、getter方法。
2.2.外部访问方式:
Human* human = [[Human alloc] init];
[human setName:@"Tim"] //或 human.name = @"Tim";
NSLog(@"%@",[human name]); //或 human.name
human.name 与 [human name] 等价,编译器会翻译成[human name] 。
2.3.自定义访问器方法
自定义getter和setter方法后,或者通过(readonly)声明的属性,编译器都不会再自动生成对应的访问器方法。
// 接口头文件中定义属性
@property (readonly)NSString* fullName;
// 实现文件中自定义访问器方法
-(NSString*)fullName{
NSLog(@"custom getter method");
return self.name;
}
2.4.更改访问方法名
@property (getter=GivenName, setter=GivenName:)NSString* fullName;
2.5.更改属性的实例变量名
//实现文件中
@synthesize firstName=givenName;
2.6.模拟类型属性
//实现类文件中@implemention前定义全局静态变量
static int max = 100;
//接口文件中定义类方法,如:
+(int)getMax;
//实现类文件中实现getMax返回max值
+(int)getMax{return MAX;}
3.实例变量
一般属性与实例变量是一一对应的,前面说过,属性会被编译器生成实例变量。但我们也可以单独的定义实例变量,但是这个实例变量只能在类内访问。
//实现类文件中
int _tempCount;
在类内访问属性 一律用self.属性名,但在以下三种方法除外:
初始化器 init / 析构器dealloc / 自定义的访问器方法
3.1.实例变量的生命周期:跟随对象实例存储在堆上。
值类型的实例变量直接“内嵌”在对象的实例中,跟随对象实例的内存释放而释放。
引用类型的实例变量通过指针“引用”堆上的引用类型实例。ARC针对引用进行计数管理,自动释放引用计数为0的对象。
4.属性的描述特性
读写属性:readwrite
只读属性:readonly
@property (readonly) NSString* fullName;
多线程特性
原子性 atomic(默认)---- 多线程同步
非原子性 noatomin
@property (atomic) NSString* fullName;
引用类型:
stong 强引用,默认的引用对象赋值都是强引用。
weak 弱引用 阻止循环引用。
循环引用:指两个类对象中都存在对方的类型的属性,而且两个属性都指向对方对象实例。从而导致ARC无法释放双方对象实例的内存。这时可将其中一个对象的属性前加上(weak)描述。
copy :赋值时 会复制原内存地址的数据到新开辟的内存地址中将指针返回给引用对象。