非ARC模式下内存管理总结
2016-03-02 11:22
399 查看
如果我们不使用ARC来自动管理内存,那么则应该记住以下准则:
1.对于临时对象:
a.通过alloc/new/copy获得的对象,应该在不再使用时释放该对象(release);
b.通过其他任何方法获得的对象,我们假设该对象的retainCount为1,且被设置为自动释放对象,因此我们不需要做任何事情;
2.对于你打算长期拥有的对象,例如你希望其他的实例对象可以访问这个对象:
a.通过alloc/new/copy获得的对象,应该在dealloc方法中释放该对象;
b.通过其他任何方法获得的对象,因为我们假设该对象的retainCount为1,且被设置为自动释放对象,现在你希望长期拥有这个对象,因此我们需要保留他(retain),同时在不再使用他的时候,在dealloc方法中释放这个对象,我们应该保证retain和release方法的使用次数是相等的;
另外,不管一个对象的retainCount是多少,比如一个NSString对象str的retainCount为2,如果执行str = nil; 那么str的retainCount都会被置为0,具体原因在这里。
因此,判断一个对象应该如何实现内存管理时,我们可以先看这个对象是怎么得到的,然后考虑我们是临时使用它还是想长期保留它,依次做出决策。
另外,自动释放池NSAutoreleasePool是以栈的形式实现的,因此当你创建一个自动释放池并加入一个希望自动释放的对象以后,再新建一个自动释放池,随后release这个自动释放池,之前创建的对象并不会被释放,因为存放他的那个自动释放池还是存在的。
实际上,在编写iPhone程序时,苹果公司建议你不要在自己的代码中使用autorelease方法,同时还要避免使用创建自动释放池对象的便利函数。
1.对于临时对象:
a.通过alloc/new/copy获得的对象,应该在不再使用时释放该对象(release);
b.通过其他任何方法获得的对象,我们假设该对象的retainCount为1,且被设置为自动释放对象,因此我们不需要做任何事情;
2.对于你打算长期拥有的对象,例如你希望其他的实例对象可以访问这个对象:
a.通过alloc/new/copy获得的对象,应该在dealloc方法中释放该对象;
b.通过其他任何方法获得的对象,因为我们假设该对象的retainCount为1,且被设置为自动释放对象,现在你希望长期拥有这个对象,因此我们需要保留他(retain),同时在不再使用他的时候,在dealloc方法中释放这个对象,我们应该保证retain和release方法的使用次数是相等的;
另外,不管一个对象的retainCount是多少,比如一个NSString对象str的retainCount为2,如果执行str = nil; 那么str的retainCount都会被置为0,具体原因在这里。
因此,判断一个对象应该如何实现内存管理时,我们可以先看这个对象是怎么得到的,然后考虑我们是临时使用它还是想长期保留它,依次做出决策。
另外,自动释放池NSAutoreleasePool是以栈的形式实现的,因此当你创建一个自动释放池并加入一个希望自动释放的对象以后,再新建一个自动释放池,随后release这个自动释放池,之前创建的对象并不会被释放,因为存放他的那个自动释放池还是存在的。
实际上,在编写iPhone程序时,苹果公司建议你不要在自己的代码中使用autorelease方法,同时还要避免使用创建自动释放池对象的便利函数。
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- 绝大部分 Android 手电筒应用需要大量权限
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 这些看似合法的 iPhone Lightning 数据线将劫持您的电脑
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 我的iPhone桌面
- Lua的内存管理浅析
- 跟我学习JScript的Bug与内存管理
- 三种检测iPhone/iPad设备方向的方法
- js实现iPhone界面风格的单选框和复选框按钮实例
- 跟我学习javascript的垃圾回收机制与内存管理
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法