在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
本文会继续深入学习OC内存管理,内容主要参考iOS高级编程,Objective-C基础教程,疯狂iOS讲义,是我学习内存管理的笔记 1 内存管理的基本概念1.1 Objective-C中的内存管理
1.2 内存管理中存在的问题
2.手动内存管理和自动释放池---
|
对象操作 | Objective-C方法 | 对应的操作结果 |
---|---|---|
生成并持有对象 |
alloc , new , copy ,mutableCopy 等方法 |
生成对象并设置引用计数 =1 |
持有对象 |
reatain 方法 |
使引用计数 +1 |
释放对象 |
release 方法 |
使引用计数 -1 |
废弃对象 |
dealloc 方法---系统自动调用 |
引用计数 =0 时调用 |
关于delloc
方法:dealloc方法继承自NSObject
,因此所有的对象都具有此方法,当一个对象的引用计数为0时,也就意味着没有任何程序需要此对象,系统会回收该对象所占用的内存,在系统销毁对象之前,会自动调用该对象的dealloc方法来执行一些回收操作,如果该对象还持有其他对象的引用,我们必须重写dealloc方法来释放该对象引用的其他对象(通常就是使用该对象的release方法)
引用计数机制回收对象的说明
:如果一个对象的引用计数为0,则表明程序已经不再需要它,这时系统会自动回收该对象所占内存,相反,如果一个对象的引用计数不为0,系统就不应该回收,也不会回收它所占的内存
关于retainCount方法
:Objective-C提供了retainCount方法来返回一个对象当前的引用计数
如何重写dealloc方法
:
- (void)dealloc {
// 处理该对象的其他引用(通过release方法)
/** 回调父类的dealloc方法 */
[super dealloc];
}
alloc
+alloc
+allocWithZone:
class_createInstance //此方法可以通过objc4中的runtime/objc-runtime-new.mm确认
calloc // 分配内存块
retainCount
-retainCount
__CFDoExternRefOperation // 此函数根据retain,retainCount,release操作进行分发,调用__CFBasicHashXXX方法
CFBasicHashGetCountOfKey
retain
-retain
__CFDoExternRefOperation
CFBasicHashAddValue
release
-release
__CFDoExternRefOperation
CFBasicHashRemoveValue // 当此函数返回0时, -release调用dealloc方法
1.1 使用alloc
new
copy
mutableCopy
创建的对象只能自己持有
id obj1 = [[NSObject alloc] init];
id obj2 = [NSObject new];
id obj3 = [NSObject copy];
id obj4 = [NSObject mutableCopy];
1.2 使用以上名称的开头的方法也意味着自己生成并持有对象
alloc
NewObject
new
NewObject
copy
NewObject
mutableCopy
NewObject
2.1 非alloc
new
copy
mutableCopy
生成的对象,变量obj本身不持有该对象
id obj1 = [NSMutableArray array];
id obj2 = [NSDictionary dictionary];
2.2 通过retain方法,非通过alloc
new
copy
mutableCopy
生成的对象,可以成为自己持有的对象
id obj = [NSMutableArray array];
[obj retain];
3.1 释放通过alloc
new
copy
mutableCopy
生成的对象,一旦不在需要,务必要使用release方法释放
id obj = [[NSObject alloc] init];
[obj release];
3.2 用retain方法持有的非自己生成的对象,一旦不再需要,也一定要使用release释放
id obj = [NSMutableArray array];
[obj retain]; // 通过retain方法持有对象
[obj release]; // 在不需要时也要通过release方法释放对象
3.3 用某个方法生成对象,并将其作为方法的返回值,这时我们该如何处理
3.3.1 通过alloc
new
copy
mutableCopy
或其他符合命名规则的方法生成的对象,只需要原封不动的返回就能让调用方也持有该对象
- (id)allocObject {
id obj = [[NSObject alloc] init];
return obj;
}
- (id)allocObjectWithObject:(id)obj {
id object = [obj allocObject];
return object;
}
3.3.2 如果持有非自己生成的对象,例如[NSMutableArray array]生成的对象,我们要使用autorelease方法释放
注:命名规则
:用来取得谁都不持有的对象的方法名不能以alloc
new
copy
mutableCopy
开头
- (id)object {
id obj = [NSMutableArray array];
[obj autorelease];
return obj;
}
3.3.3 autorelease
方法:提供了这样的功能,使对象在超出指定的生存范围时自动并正确释放(调用release方法)
4.1 通过alloc
new
copy
mutableCopy
方法或者通过retain方法持有的对象,一旦不再需要时,必须进行释放,除此之外其他方法获得的对象绝对不能释放,一旦释放会造成程序崩溃
4.2 自己持有的对象释放后再次释放,造成僵死对象,引起程序崩溃或在访问废弃的对象时崩溃
id obj = [[NSObject alloc] init];
[obj release];
[obj release]; // 再次释放
请发表评论