您的位置:首页 > 移动开发 > IOS开发

ios内存管理&1之常见的内存管理

2015-12-13 17:16 190 查看
内存管理ARC(Automatic Reference Counting)&MRC(Manual Retain Counting)&自动释放

本人所写博客均是个人理解,若有错误欢迎大家指正... ...
iOS中我们均是调用指针来使用数据:使用的数据保存在内存中。手机内存一定所以我们需要对手机的内存进行管理。
IOS5之前我们使用MRC进行手动管理内存,这时我们需要自己申请储存空间自己手动释放内存。
IOS5之后我们使用ARC进行管理内存,换句话说(cocoa管理对象交给手机进行管理)。

内存管理:其实我们需要明白是谁对于内存有拥有权,就像我们自己兜里的钱一样。
MRC中就像我们需要自己挣钱(retain)然后自己负责把钱花掉(release)。
ARC中随着我们经验提升经理,然后就把自己挣钱(内存管理)的机会交给我们手下(ARC)。

ARC中我们申请内存的方式有两种:显示申请(使用alloc,copy) [[NSArray alloc] init];
隐士申请 [NSArray array]。
ARC在管理内存的实质是引入计数器(count),当我们在使用alloc和copy是计数器就retain加1,所有管理对象放在垃圾回收池中在一定的时间进行释放(释放的时间我们不确定)。

但是身为经理我们也要自己考虑做些事情:
-(NSArray *)array{
NSArray *array = [[NSArray alloc] init];
return array;
}
自动释放池(autoReleasePool)
当我们使用上述方法进行释放内存时应该怎么做呢?
两种方法:(1)在返回前我们使用释放,这样会指针指向垃圾区域。
(2)在返回后进行释放,但是函数返回时方法退出。
这样我们目的就项减少计数(release),我们可以采取下列方法。把我们申请的内存放入自动释放池中(autoReleasePool中进行自行释放)

-(NSArray *)array{
NSArray *array = [[NSArray alloc] init];
return [array autorelease];
}

自动释放池的目的(本人理解):是为了释放程序运行过程中内存过大引起CPU过载,起到性能优化。

下面是关于内存管理的拓展:
ARC中知道我们是把内存管理交给Cocoa,换句话说ARC自动管理内存仅仅管理Cocoa的对象。
但是有些不是Cocoa的对象时就需要我们考虑内存管理方法。
(1)当对象时(Void *)指针类型时;
(2)当对象时CFTypeRefs时;
此时我们要通过(_bridge)桥连接的方式来进行强制转换。

下面我们就模拟ARC在MRC情形下对数据进行Retain和Release的操作:

在ARC下:

-(void)method{

NSArray *mArray = [NSArray
array];

NSArray *myOtherArray = mArray;

}

我们可以看到在ARC中我们使用NSArray过程,下面是我们仿照ARC对于我们进行的MRC操作(只是模拟操作)。

-(void)method1{

NSArray *mArray =
nil;

id temp1 = mArray;

mArray = [NSArray
array];

[mArray retain];

[temp1 release];//因为temp1为nil所以没有任何影响

NSArray *myOtherArray =
nil;

id temp2 = myOtherArray;

myOtherArray = mArray;

[myOtherArray retain];

[temp2 release];

[mArray release];

mArray = nil;

[myOtherArray release];

myOtherArray = nil;

}
下面对于我们模仿ARC在MRC进行解释:
(1)*mArray = nil; 是我们防止在MRC中提前释放掉内存然后进行第二次释放内存照成的—>悬浮指针。
(2)id temp1 = mArray; 进行中间变量的赋值可以看出在ARC复制过程中—>引入临时变量指向保留的对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: