1.OC中内存管理方式分MRC和ARC两种
MRC:手动管理引用计数。ARC:自动管理引用计数。
ARC实现的原理是MRC。
2.引起引用计数变化的方法
加1:alloc,retain,copy;
减一:release(引用计数立即减一),autorelease(在未来的某个时刻引用计数减一,这个时刻跟autoreleasepool有关);
3.操作引用技术的原则
有alloc,retain,copy就要有相应的release,autorelease;没有的话就不进行任何操作;
4.自动释放池(autorelease)的操作
作用:管理自动释放(autorelease)的对象。
系统在开发者创建工程时会在应用程序的主线程中创建一个默认的自动释放池(子线程中不创建)此释放池生命周期为整个应用程序的生命周期。开发者添加自动释放池使用@autoreleasepool{}(生命周期为大括号内)。如果程序中有多个自动释放池,那么,自动释放的对象由离他最近的释放池管理。如果自动释放池和大循环一起操作,自动释放池放在循环内部,防止产生的大量临时对象不能被及时释放;当应用程序和用户之间产生交互,系统会自动帮用户创建自动释放池,管理交互过程中产生的临时对象,交互结束,释放池生命周期结束。
5.属性的内存管理(assign,retain,copy)
如果属性声明时使用的关键字为assign,不需要在类内部进行内存管理;
如果属性声明时使用的关键字为retain和copy,需要在类内部进行内存管理,需要重写dealloc方法。在dealloc中对属性对性的对象发送release消息。eg:
@interface Person : NSObject
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (assign, readonly) NSString *fullName;
@end
@implementation Person
// ...
- (void)dealloc
[_firstName release];
[_lastName release];
[super dealloc];
}
@end
6.容器类内存管理
将对象添加进入容器,容器对象会对容器内部对象进行引用计数的保留(也就是计数+1,retain)
从容器中移除该对象,容器会对对象release(计数-1)
容器对象进行release,会对容器的所有对象发送release(容器内所有对象减一)
7.copy
给系统类的不可变对象发送copy消息会对该对象的引用计数加1 (和retain功能相同)
如果给系统类可变对象发送copy消息会创建出不可变的副本,原对象引用计数不变,副本对象引用计数加1;
给系统类的不可变对象发送mutableCopy消息,得到的是一个可变的对象副本,源对象引用计数不变,副本引用计数+1;
给系统的可变对象发送mutableCopy消息,会得到一个可变的对象副本,源对象引用计数不变,副本+1
容器中的对象全部都是指针拷贝(浅拷贝)。
如果自定义类要实现copy方法,必须先遵守NSCopying协议,实现copyWinthZone方法。
不可变的容器在使用了mutableCopy后会变成可变的;
不论是深拷贝还是浅拷贝,容器里面的元素都是浅拷贝;
可变的数组在接收了Copy后变成一个不可变的数组;
OC之内存分配