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复制过程中—>引入临时变量指向保留的对象。
本人所写博客均是个人理解,若有错误欢迎大家指正... ...
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复制过程中—>引入临时变量指向保留的对象。
相关文章推荐
- iOS编译ffmpeg
- IOS RSA加密
- IOS安装FFmpeg调用成功总结的一些问题
- iOS 通知传值
- iOS运行时runtime初探(强制获取并修改私有变量,强制增加及修改私有方法等)
- Xcode 及 iOS 常用宏和常量
- TableView详解
- [分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享
- iOS接入支付宝
- iOS Label 作为分割线时 上下左右切边
- IOS开发中NSURL的基本操作及用法详解
- iOS 简单实现alertview 定时移除
- iOS Block传值
- IOS中的Block的使用
- iOS 开发 入门:真机测试
- iOS和JS的交互
- iOS,侧滑(最简单效果却很好的侧滑功能实现
- iOS instancetype和id类型区别
- 推荐关于解读3D Touch开发的两篇文章
- ios即时通讯客户端开发之