IOS内存管理浅析
2015-07-09 17:35
330 查看
内存管理:
1 简述:
(1) java使用GC机制自动管理内存,Object-C支持手动管理内存,也支持GC机制,但GC机制对IOS设备无效,仅对MacOSX电脑有效
(2) Object-C使用alloc,new,copy的时候为对象分配内存,然后返回分配的内存的首地址存入指针变量,使用dealloc释放内存
(3) Object-C中的对象都是使用指针引用的,也就是在方法调用的时候传递的都是指针.
2:内存回收机制
(1) 采用计数器retainCount来表示对象的引用次数,一个对象在被alloc之后就retainCount就是1,之后每调用一次retain方法retainCount都会加1.(这里的调用指得是:调用retain方法).调用release都会使retainCount减1.(2) 当Object-C发现一个对象的retainCount计数器为0时,就会调用这个对象从NSObject继承而来的dealloc方法回收内存,这个调用动作是Object-c运行环境完成的.
(但这里每一个对象的retainCount永远不会为0,系统会进行判断,若对象的retainCount值为1时,此时再执行release方法不会将retainCount的值置为0,而是直接调用dealloc方法,但对象的retainCount一直为1,对象任指向当初的内存,若此时再对对象进行操作就会产生异常).
(3) 按照谁创建谁负责回收的原则
3 列如下面的操作:
-(void) dealloc{[city release];
[super dealloc];
}
-(void) setCity: (NSMutableString*) c{
[c retain];//---1
[city release];//---2
city=c;//---3
} (测试:查看city release之后
c 的计数器retainCount的值)
{
因为变量之间传递的都是指针,所以当变量的引用执行retain或release方法时,原变量的retainCount也会发生相应的变化.
}
(1) 在java使用GC机制的语言中,我们只需要写第三条语句,若在Object-C中只写第三条语句,我们管这种方式获得的city叫做弱引用,也就是city只是通过赋值操作.把自己指向了C指向的对象,但是对象本身的引用计数器没有任何变化,此时City就要承担
[c release]之后所带来的风险.
(2) 大多数情况下,我们使用的是强引用(retain),先通过retain方法拿到对象的拥有权.
(3) 第二行代码目的:假如:city之前已指向一个对象,若不对city进行一次release,而直接把city指向c指向的对象,那么city原来指向的对象可能会出现内存泄露.
(4) 第一行代码和第二行代码顺序不能变换(原因:当把自己作为参数赋值给自己的时候,若先调用[c release] 那么回导致该对象的retainCount 变为0,从而被系统delloc回收,则[c retain] 就会报错).
(5) 当对象使用完后系统就会调用delloc方法,释放所有权.对象被release之后,指针任然指向当初的内存,若再调用对象的方法则会出现异常,可通过将指针赋值为nil ,虽然此时不会报错,但也屏蔽了错误.
4 iOS5及其以上版本不使用ARC机制的设置方法
(1) TARGETS ➔ Build Phases➔ Compile Sources ➔ 点击Compiler Flags
➔ 设置为-fno-objc-arc
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Lua的内存管理浅析
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 深入探讨PHP中的内存管理问题
- .net平台推送ios消息的实现方法
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- javascript内存管理详细解析
- JavaScript内存管理介绍
- 探讨Android与iOS,我们将何去何从?
- Cocos2d-x的内存管理总结
- Android、iOS和Windows Phone中的推送技术详解
- javascript错误的认识不用关心内存管理