基础iOS学习开发程序员

内存管理大总结

2016-07-20  本文已影响113人  你好自己

1.自动引用计数的概念

2.内存管理/引用计数

2.1.1 内存管理的思考方式举例

对办公室照明设备所做的动作和对OC对象所做的动作

对照明设备所做的动作 对OC对象所做的动作 OC方法
开灯 生成并持有对象 alloc/copy/new/mutableCopy等方法
需要照明 持有对象 retain方法
不需要照明 释放对象 release方法
关灯 废弃对象 dealloc方法

小结:

不知道的点:
这些有关的OC内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于OSX iOS应用开发.Cocoa框架中的Foundation框架类库中的NSObject类担负内存管理的职责.OC内存管理中的alloc/retain/release/dealloc方法分别指代NSObject类的alloc类方法,retain实例方法,release实例方法和dealloc实例方法.

针对小结的内容解释如下:

release和autorelease的区别

release autorelease
对象立即释放 对象不立即释放

注册到autoreleasepool中,pool结束时自动调用release

2.1.2 alloc/retain/release/dealloc实现

2.1.5 autorelease

autorelease的具体使用方法如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
id obj = [[NSObect alloc]init];
[obj autorelease];
[pool drain];

尽管如此,当在大量产生autorelease对象时,只要不废弃NSAutoreleasePool对象,那么生成的对象就不能被释放,因此有时候会产生内存不足的现象.
正确的做法是 把自动释放池的创建放在for循环内.代码如下:

for(int i = 0; i< 100000;i++)
{
NSAutoreleasePool *pool = [][NSAutoreleasePool alloc]init];//读入图像,产生大量`autorelease`的对象.
[pool drain];
}

在OC中,也就是Foundation框架时,无论调用哪一个对象的autorelease实例方法,实际上调用的都是NSObject类的autorelease实例方法.但是对于NSAutoreleasePool类,autorelease实例方法已被该类重载,因此运行就会报错.

//这样写是错误滴
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
[pool autorelease];
上一篇下一篇

猜你喜欢

热点阅读