`

iphone开发内存管理──静态全局变量的内存问题

    博客分类:
  • ios
 
阅读更多

我们在项目中,有时需要一些全局变量存储一些基本信息,那么这些全局的变量内存又是如何管理的呢?

下面是网友分享的经验,具体的网址我记不清了,我在这里直接拿过来放到我的博客了,在此向写本文的作者致敬!

正是由于众多具有开源精神的网友,技术才能更好的传播!

 

项目中有时需要一些全局变量存储应用程序运行过程中的一直存在的信息,翻看了一些资料,决定使用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 DisposalDeallocating an Object一节的important:一段

分享到:
评论

相关推荐

    iPhone开发全局变量的使用

    iPhone开发全局变量的使用的一个很好用的demo

    iphone全局变量配置

    iphone全局变量和配置及程序,介绍了如何设置全局变量 如何访问配置文件 iphone全局变量和配置及程序,介绍了如何设置全局变量 如何访问配置文件

    ios iphone开发-内存管理

    ios iphone开发-内存管理 所有权是iPhone内存管理的核心思想,对象的所有者负责在使用完对象后进行释放。一个对象可以有多个所有者,当它没有所有者时将被设置为取消分配(deallocation)

    IOS IPhone 内存管理

    IOS IPhone 内存管理,可以学到内存管理的精髓。

    iPhone内存管理

    详细且全面地讲述了iPhone开发中的内存管理技术

    iPhone开发实战.pdf

    iPhone开发实战 iPhone开发 iPhone iPhone4 iPhone开发实战 iPhone开发 iPhone iPhone4

    iPhone开发基础教程电子书

    这本书也写得非常好,里面非常系统地讲解了开发iphone和ipad上面的游戏需要注意的一些问题,比如内存很少的问题等。同时书里还涉及了cocos2d开发中大部分的内容,基本上可以说是所有的内容。同时,这本书的作者的...

    Iphone开发系列源码——Iphone主题源码

    Iphone开发系列源码——Iphone主题源码Iphone开发系列源码——Iphone主题源码Iphone开发系列源码——Iphone主题源码Iphone开发系列源码——Iphone主题源码Iphone开发系列源码——Iphone主题源码Iphone开发系列源码...

    Iphone开发系列源码——iPhone版Wordpress源代码

    Iphone开发系列源码——iPhone版Wordpress源代码Iphone开发系列源码——iPhone版Wordpress源代码Iphone开发系列源码——iPhone版Wordpress源代码Iphone开发系列源码——iPhone版Wordpress源代码Iphone开发系列源码...

    根据全局变量判断设备是不是iphone5

    由于iphone5尺寸的变化,在有时候界面布局的时候需要知道什么设备,所以自己做了个demo,在程序中设定一个全局变量,在进入程序的时候进行赋值,然后根据值的结果判断在程序中的什么时候使用什么布局。

    Iphone开发系列源码——Image图片缩放随着手指

    Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image图片缩放随着手指Iphone开发系列源码——Image...

    iPhone开发基础教程-PDF版

    iPhone开发,iPhone开发教程,iPhone开发基础教程PDF版

    iPhone开发基础教程

    《iPhone开发基础教程》内容完整丰富,具有较强的通用性,编程领域中各层次读者都能通过《iPhone开发基础教程》快速学习iPhone开发,提高相关技能。iPhone 是一种全新的移动平台,苹果公司为它推出了强大的软件开发...

    iPhone开发入门到精通视频教程

    资源名称:iPhone开发入门到精通视频教程资源目录:【】iOS开发源码系列---工具【】iOS开发源码系列---应用【】iOS开发源码系列---游戏【】iOS开发源码系列---类库与框架【】iOS开发真机测试与发布【】iOS开发视频...

    iPhone Mac Objective-C内存管理教程和原理剖析

    初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏 或莫名其妙的崩溃。我在这里总结了自己对objective-C内存管理机制的研究成果和经验,写了这么一个由 浅入深的...

    iPhone开发教程之iPhone内存释放注意事项两则--千锋培训

    文档介绍了iPhone内存通过free释放的两个注意事项

    iPhone 内存管理

    iPhone 内存管理文档,OC_MemoryMgmt

    轻松学iPhone开发

    轻松学iPhone共分3篇。第1篇介绍iPhone的发展、iPhone开发环境以及开发工具的安装过程、iPhone Simulator模拟器

    iphone开发实战

    本书全面探讨了iPhone平台的两种编程方式——Web开发和SDK编程。全在Web开发方面,分别介绍了三个iPhone Web库,即WebKit、iUI和Canvas,并讨论了Web开发环境Dashcode,最后阐述Web应用程序的调试。在SDK开发方面,...

    深入浅出iPhone开发(清晰版,内含中英2个版本的书)

    知名的Head First系列丛书之一,风格与其他Head First系列一脉相承,一定能让读者轻松学会iPhone开发,《深入浅出iPhone开发》是针对iPhone开发的初学者设计的,以几个应用实例的开发为例,循序渐进地对iPhone开发的...

Global site tag (gtag.js) - Google Analytics