项目中有时需要一些全局变量存储应用程序运行过程中的一直存在的信息,翻看了一些资料,决定使用Apple官方文档推荐的Signaleton模式,使用过程很顺利,但是随之而来的是关于内存管理的考虑,官方文档的示例代码如下:
static MyGizmoClass *sharedGizmoManager = nil;
+ (MyGizmoClass*)sharedManager
{
if (sharedGizmoManager == nil) {
sharedGizmoManager = [[super allocWithZone:NULL] init];
}
return sharedGizmoManager;
}
+ (id)allocWithZone: (NSZone *)zone
{
return [[self sharedManager] retain];
}
- (id)copyWithZone: (NSZone *)zone
{
return self ;
}
- (id)retain
{
return self;
}
- (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
}
- (void)release
{
//do nothing
}
- (id)autorelease
{
return self;
}
可以看到上面的代码中除了为保证这个静态类的唯一性,还有一个奇怪的地方则是这个类没有dealloc方法,那么这个类实例化后所分配的内存是在什么时候释放的?如果这个类中还含有一些其他的成员变量,这些变量所分配的内存又是在何时释放的呢?
以之前C/C++平台的经验,静态变量的内存被放在全局区(或称之为静态区),静态变量的内存在应用程序启动之前由系统分配,在应用程序退出之后又由系统自己回收。Cocoa基于C设计,所以大致上应该也是这个样子。
为了验证这个问题,我尝试着给这个类添加了一个dealloc方法,之后更加奇怪的事情就发生了,我在这个类dealloc方法中设置断点并且尝试输出log,但当程序退出时不仅断点没有断下来,甚至在console中连这段log的踪影都看不到,我开始怀疑这段dealloc没有被调用,之后我又在其他类的dealloc方法中输出log,发现一个规律:dealloc方法在程序运行过程中随着类实例的释放会被调用,但是当直接退出程序时(按HOME键),所有的dealloc都不被调用。这就说明当应用退出的时候,Cocoa是不会调用实例的dealloc方法的,这是意味着什么呢?我猜想,可能Cocoa会在应用程序退出时自己回收所有的内存,并且不像C++那样去调用存在的类实例的析构方法?为证实这个猜想,google之,最终在Cocoa With Love和Apple的另一份官方文档中找到了答案,并证明我的这个猜测是正确的:
官方文档中是这么解释的: " When an application terminates, objects may not be sent a dealloc message since the process’s memory is automatically cleared on exit—it is more efficient simply to allow the operating system to clean up resources than to invoke all the memory management methods." 大致的意思就是:当应用程序退出时,对象不会接受到一个dealloc消息,系统会自己清理所有的资源,Apple认为这样比去调用一个内存管理方法更有 效率。
Cocoa With Love的Matt关于我提问的解答是这样的: "You don't need to free data from a singleton -- it lasts until the program quits, so the dealloc method will never be invoked. If you need to close a network connection, or something else that actually needs to be ended, you should do this in a "close" method and invoke the "close" method on the singleton in your applicationWillTerminate: method of your application delegate." 意思差不多和官方一样,应用退出时,dealloc方法不会被调用,并且他建议我避免在dealloc中去作网络或其他类似的必须终止的操作,而应该将这 些操作放在applicationWillTerminate:中,以确定这些操作被执行。
呵呵,谢谢Matt,他的这个建议确实是非常有效果的,否则我的下一个问题肯定的是:那么一定得终止的操作放在哪里执行?
所以关于这个问题的研究暂时就告一段落了,得出的结论是:
1.不用担心静态全局变量的内存的问题,系统会在应用程序结束之后,回收这些内存;
2.应用程序结束时会直接回收所有的程序运行中的资源,而不调用对象的dealloc方法;
3.不要将类似网络或文件的关闭(应该是任何)操作放在类的dealloc方法中执行;
当然这也只是告一段落了,由此我又产生了两个问题:
1.如果系统会在程序结束后回收所有的资源,那么是否基本不用考虑什么内存泄露的问题?内存泄露只会在程序运行过程中发生?即使发生了内存泄露,应用程序退出时,系统也会回收这些内存;
2.Cocoa如何实现这一套资源管理机制的呢?只以内存说,难道系统给应用程序指定一段内存,你应用程序分配的内存只会在这一段区域里,当应用程序退出之后,我系统就直接抹了这段内存?
这两个问题想请教tinyfool 和 robinlu,不知他们二位有没有时间。不过我的这个blog太丑了,我先把字弄大点.
文中参考资料:
1.Apple推荐Sinaleton方法的文档Cocoa Fundamental Guide:Cocoa Objects中Creating a Singleton Instance一节 这里还有中文的
2.Cocoa With Love中关于top-level data的话题:Singletons, AppDelegates and top-level data. 这里讨论还了你需要全局数据的条件,还提供了另外一个方法存放全局的数据:放置在AppDelegates中,并且讨论了这种方法的不妥之处,建议和我一样的新手可以拜读一下.
3.Apple解释应用程序退出时不调用dealloc方法的文档:Memory Management Programming Guide for Cococa:Object Ownship and Disposal中Deallocating an Object一节的important:一段
本文摘自:http://blog.sina.com.cn/s/blog_6b9c53390100sawg.html
相关推荐
本资源"iphone-static-library-project-template"提供了一个用于创建iOS静态库项目的模板,旨在帮助开发者快速搭建并管理静态库项目,提高开发效率。 一、静态库的原理与优势 1. 静态库原理:静态库在编译时会将库...
《iPhone狂:约会iPhone》这本书是专为iPhone用户准备的实用手册,它旨在帮助用户快速掌握iPhone的各种使用技巧,同时提供了解决常见问题的方法。这本书的内容非常适合那些初次接触iPhone的用户,以及那些希望通过更...
《iPhone 11维修资料详解》 在当今的科技时代,智能手机已经成为我们日常生活的重要组成部分,尤其是像iPhone 11和iPhone 11 Pro这样的高端设备。这些设备集成了先进的技术,为用户带来了卓越的体验。然而,随着...
在影子系统中用itunes为客户同步iphone软件.zip
【标题】:“卡iPhone在线工具”通常指的是帮助用户解决iPhone设备在使用过程中出现网络连接问题的软件或服务。这类工具可以是独立的应用程序,也可以是网页版的服务,旨在诊断并修复iPhone的网络故障,比如无法上网...
有时,运营商可能会推送IPCC更新来修复网络连接问题或增加对新频段的支持,这对于经常旅行或使用不同网络的用户尤其重要。 在进行此类操作时,确保设备连接到可靠的网络,并备份好重要数据以防万一。同时,只安装...
此外,这个库可能还包含了iPhone的屏幕尺寸适配元素,例如针对不同尺寸的iPhone(如iPhone SE、iPhone 8、iPhone X系列)的布局和组件。 使用这个元件库,原型设计师无需从零开始绘制每个组件,可以直接拖放这些...
《苹果iPhone 4维修手册与电路图解析》 在电子消费产品领域,苹果公司的iPhone系列一直备受关注。作为第四代产品的iPhone 4,其凭借独特的设计、强大的性能以及优秀的用户体验,成为了当时的标志性设备。本篇将围绕...
《iPhone 4 完整电路图PCB详解》 iPhone 4是苹果公司在2010年推出的一款标志性智能手机,其设计与技术在当时堪称业界领先。本篇将深入解析iPhone 4的完整电路图PCB(Printed Circuit Board),帮助读者理解这款设备...
标题 "iPhone紫屏工具.zip" 暗示了这是一个针对iPhone设备出现紫屏问题的修复工具包。紫屏现象通常是由于硬件故障、软件冲突或驱动程序问题导致的屏幕显示异常,用户可能在启动或使用iPhone时看到屏幕变为紫色或者带...
iphone X iphone 8 原型框 iphone X iphone 8 原型框
对于iPhone元件库,其涵盖了多种iPhone机型,例如iPhone SE、iPhone 6/6S/7/8系列、iPhone X/XS系列、iPhone XR、iPhone 11系列、iPhone 12系列以及iPhone 13系列等。这些模型不仅包括手机的外观,还可能包括屏幕...
在IT领域,特别是移动设备部分,苹果公司的iPhone一直以其独特的用户体验和设计著称。其中,iPhone的提示音是用户日常操作中不可或缺的一部分,它们为用户提供了一系列声音反馈,以告知用户各种事件的发生。在这个名...
"Axure元件库iPhone"是专门为设计iPhone应用原型而定制的一套元件集合。该库不仅提高了设计效率,还确保了设计的准确性和一致性,因为这些元件都是按照iOS设备的界面规范和设计风格制作的。 首先,我们来看一下...
### iPhone4S 5.1.1固件详解 #### 一、固件版本与设备兼容性 在本文档中,我们重点介绍的是iPhone 4S的5.1.1固件版本及其相关信息。固件是指设备上的底层操作系统,对于苹果设备而言,这通常指的是iOS系统的一个...
8. **原型与测试**:在实际开发前,通过工具如InVision或Figma创建交互原型,进行用户测试,以优化设计并发现潜在问题。 9. **可访问性**:设计时应考虑不同用户的需求,包括视力障碍者和其他身体障碍的用户,确保...
想在普通电脑上让你发表的空间说说显示来自iPhone嘛?火狐专用浏览器就可以实现这个效果!不但可以显示发布的说说来自iPhone触屏版,还可以显示iPad或android,绝对给力,不管你信不信,反正我是信了,我已经测试100%...
这类软件主要是针对iPhone设备出现卡顿、内存不足、电池续航短等常见问题而设计的,它们通常具备清理垃圾文件、优化内存、加速手机运行、管理应用等功能,旨在提升iPhone的运行效率和用户体验。这类软件可以在电脑上...
【苹果iPhone原机铃声包】是一份专为苹果iPhone用户设计的资源集合,它包含了iPhone出厂时预装的一些经典铃声。这些铃声是苹果公司精心挑选并制作的,旨在提供用户多样化的选择,以满足不同用户的个性化需求。通过这...