内存管理分为:MRC、ARC
MRC:手动管理引用计数器
ARC:自动管理引用计数器
ARC的释放原理//是MRC,会引起计数器上变化。只要没有强指针指向对象,就会释放对象。
+1:retain、alloc、copy
-1:release(立即-1)、autorelease(遇到释放池)
操作引用计数器原则:有alloc、retain、copy就要有相应的release或autorelease,没有的话,不进行任何操作。
autoreleasepool的操作
作用:管理自动释放的对象(autorelease)的对象。
系统在开发者创建工程时会在应用程序的主线程中创建一个默认的自动释放池(子线程不会创建),此释放池生命周期为应用程序的生命周期。
开发者添加自动释放池,使用@autoreleasepool{},生命周期为大括号内部。
如果有多个自动释放池,那么自动释放池由离它最近的释放池所管理。
如果大循环和自动释放池联合操作,这时应将自动释放池放在循环内部,防止自动产生的临时对象不能被及时回收。
当用户与应用程序产生交互时,系统会自动帮用户创建自动释放池用来管理交互过程中产生的临时对象。交互结束,释放池的生命周期结束,因此应尽量少使用类方法来创建对象。
属性内存管理:
assign retain copy
如果属性声明时使用的是assign,不许进行内存管理。
如果使用的是retain或copy,需要进行内存管理,需用重写dealloc方法,在dealloc方法中对属性相对应的实例变量发送release消息。
例如:
@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
容器类(collection)内存管理
1、将对象添加进容器,容器对象会对该对象进行引用计数的保留,也就是引用计数+1(即retain)
2、从容器中移除该对象,会对该对象引用计数-1(release)
3、容器对象进行release时,会对容器内所有对象引用计数-1(release)。
copy:
给系统类(例:NSString。。。)的不可变对象发送copy消息,会对该对象的引用对象+1,和retain功能相同。
给系统类的可变对象发送copy,会创建出不可变的副本,原对象引用计数不变,副本对象引用计数+1.
3.给系统类的不可变对象发送mutableCopy消息会得到一个可变的对象副本,原对象引用计数不变,副本对象引用计数加一。
4.给系统类的可变对象发送 mutableCopy消息会得到一个可变的对象副本,原对象引用计数不变,副本对象引用计数加一。
5.容器中的对象全是指针拷贝(浅拷贝)。
6.如果自定义类要实现copy方法,必须先遵守NSCopying协议,实现copyWithZone方法。