系统自动生成的自动释放池是跟随着整个应用程序的生命周期,只有当应用程序结束的时候他才释放
内存管理
1.内存管理的方式分为:MRC和ARC。
MRC:手动管理引用计数
加一的:alloc,retain,copy
减一的:release(引用计数立即减一) ,autorelease(在未来的某个时刻引用计数减一,这个时刻跟autoreleasepool有关)。
3.操作引用计数的原则:有alloc,retain,copy就要有相对应的release和autorelease,没有的话不进行任何操作。
4.自动释放池(autoreleasepool)的操作:
作用是:管理自动释放(autorelease)的对象。
系统在开发者创建工程时会在应用程序的主线程中创建一个默认的自动释放池(子线程中不创建)此释放池的生命周期为整个应用程序的生命周期
开发者添加自动释放池@autoreleasepool{},生命周期为大括号内内。如果有多个自动释放池,那么自动释放的对象有离他最近的释放池所管理。
如果打的循环和自动释放池联合操作,这时候应把自动释放池放在循环内,防止产生的大量临时对象不能被及时回收。
当应用程序和用户之间产生交互时,系统会自动帮助用户创建自动释放池用来管理交互过程中产生的临时对象。交互结束,释放池生命周期就结束了。
5.属性的内存管理:(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
6.容器类对象的内存管理
1)将对象添加进容器,容器对象会对该对象进行应用计数的保留(引用计数+1,retain)
2)从容器对象中移除对象,容器对象会对该对象进行引用计数release(引用计数减一)
3) 容器对象进行release时,会对该容器内的所有对象发送release消息(容器内的所有对象引用计数减一)
7.
1)给系统类的不可变对象发送copy消息,会对该对象的引用计数+1(和retain功能相同)
2)给系统类的可变对象发送copy消息,会创建出不可变的副本,原对象引用计数不变,副本对象引用计数+1。
3)给系统类的不可变对象发送mutablecopy消息,会得到出可变的副本,原对象引用计数不变,副本对象引用计数+1。
4)给系统类的可变对象发送mutablecopy消息,会得到出可变的副本,原对象引用计数不变,副本对象引用计数+1。
5)容器中的对象全部都是指针拷贝(浅拷贝)
6)如果自定义类要实现copy方法,必须先遵守NSCopying或者NSMutablrcopying协议,实现copyWithZone方法
内存管理
1.内存管理的方式分为:MRC和ARC。
MRC:手动管理引用计数
ARC:自动管理引用计数。
ARC实现的原理是MRC
2.会引起引用计数发生变化的方法:加一的:alloc,retain,copy
减一的:release(引用计数立即减一) ,autorelease(在未来的某个时刻引用计数减一,这个时刻跟autoreleasepool有关)。
3.操作引用计数的原则:有alloc,retain,copy就要有相对应的release和autorelease,没有的话不进行任何操作。
4.自动释放池(autoreleasepool)的操作:
作用是:管理自动释放(autorelease)的对象。
系统在开发者创建工程时会在应用程序的主线程中创建一个默认的自动释放池(子线程中不创建)此释放池的生命周期为整个应用程序的生命周期
开发者添加自动释放池@autoreleasepool{},生命周期为大括号内内。如果有多个自动释放池,那么自动释放的对象有离他最近的释放池所管理。
如果打的循环和自动释放池联合操作,这时候应把自动释放池放在循环内,防止产生的大量临时对象不能被及时回收。
当应用程序和用户之间产生交互时,系统会自动帮助用户创建自动释放池用来管理交互过程中产生的临时对象。交互结束,释放池生命周期就结束了。
5.属性的内存管理:(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
6.容器类对象的内存管理
1)将对象添加进容器,容器对象会对该对象进行应用计数的保留(引用计数+1,retain)
2)从容器对象中移除对象,容器对象会对该对象进行引用计数release(引用计数减一)
3) 容器对象进行release时,会对该容器内的所有对象发送release消息(容器内的所有对象引用计数减一)
7.
1)给系统类的不可变对象发送copy消息,会对该对象的引用计数+1(和retain功能相同)
2)给系统类的可变对象发送copy消息,会创建出不可变的副本,原对象引用计数不变,副本对象引用计数+1。
3)给系统类的不可变对象发送mutablecopy消息,会得到出可变的副本,原对象引用计数不变,副本对象引用计数+1。
4)给系统类的可变对象发送mutablecopy消息,会得到出可变的副本,原对象引用计数不变,副本对象引用计数+1。
5)容器中的对象全部都是指针拷贝(浅拷贝)
6)如果自定义类要实现copy方法,必须先遵守NSCopying或者NSMutablrcopying协议,实现copyWithZone方法