一、基本原理
1.什么是内存管理
2.对象的基本结构
3.引用计数器的作用
4.引用计数器的操作
5.对象的销毁
二、Xcode的设置
1.取消ARC
要想手动调用retain、release等方法,在创建项目的时候不要勾选ARC
2.开启僵尸对象监控
默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控
二、内存管理原则
1.原则分析
QQ堂开房间原理:只要房间还有人在用,就不会解散
只要还有人在用某个对象,那么这个对象就不会被回收
只要你想用这个对象,就让对象的计数器+1
当你不再使用这个对象时,就让对象的计数器-1
2.谁创建,谁release
如果你通过alloc、new或[mutable]copy来创建一个对象,那么你必须调用release或autorelease
换句话说,不是你创建的,就不用你去[auto]release
3.谁retain,谁release
只要你调用了retain,无论这个对象是如何生成的,你都要调用release
4.总结
四、set方法的内存管理
如果你有个OC对象类型的成员变量,就必须管理这个成员变量的内存。比如有个Book *_book
1.set方法的实现
- (void)setBook:(Book *)book{ if (book != _book) { [_book release]; _book = [book retain]; } }
2.dealloc方法的实现
- (void)dealloc { [_book release]; [super dealloc]; }
五、@property参数
1.控制set方法的内存管理
2.控制需不需生成set方法
readwrite :同时生成set方法和get方法(默认)
readonly :只会生成get方法
3.多线程管理
atomic :性能低(默认)
nonatomic :性能高
4.控制set方法和get方法的名称
setter : 设置set方法的名称,一定有个冒号:
getter : 设置get方法的名称
6.循环引用
1.@class
使用场景
对于循环依赖关系来说,比方A类引用B类,同时B类也引用A类
这种代码编译会报错。当使用@class在两个类相互声明,就不会出现编译报错
用法概括
使用 @class 类名; 就可以引用一个类,说明一下它是一个类
@class和#import的区别
2.循环retain
比如A对象retain了B对象,B对象retain了A对象
这样会导致A对象和B对象永远无法释放
3.解决方案
当两端互相引用时,应该一端用retain、一端用assign
七、autorelease
1.autorelease
2.自动释放池的创建
ios 5.0后
@autoreleasepool { // .... }
ios 5.0前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // ..... [pool release]; // 或[pool drain];
3.应用实例
跟release的对比
以前:
Book *book = [[Book alloc] init];
[book release];
现在:
Book *book = [[[Book alloc] init] autorelease]; // 不要再调用[book release];
一般可以为类添加一个快速创建对象的类方法
+ (id)book { return [[[Book alloc] init] autorelease]; }
外界调用[Book book]时,根本不用考虑在什么时候释放返回的Book对象
4.规律
一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease
比如下面的对象都已经是autorelease的,不需要再release
NSNumber *n = [NSNumber numberWithInt:100]; NSString *s = [NSString stringWithFormat:@"jack"]; NSString *s2 = @"rose";