黑马程序员--Object-C和Swift内存管理机制

来源:互联网 发布:c语言黑客代码大全 编辑:程序博客网 时间:2024/06/11 23:42

        内存管理是程序设计中常见的资源管理的一部分。每个计算机系统或者手机系统可供程序使用的资源都是有限的,这些资源包括内存、打开文件数量以及网络连接等。尤其是在手机上的表现比PC更加明显,对APP的要求比PC程序要高,才能给用户更友好流畅的用户体验。


      对象生命周期
       对象生命周期包括:
  • 诞生(通过alloc或者new方法实现)
  • 生存(接收消息和执行操作)
  • 交友(借助方法的组合和参数)
  • 终结(完成使命后被释放)

       突然想起了《骇客帝国》里面一段尼奥拯救没用的代码段小男孩的画面,话说留着就是资源占用多浪费,不清理系统还转不转了!档声明周期结束时,他们的原材料会被回收以供新的对象使用。


       Object-C的内存管理机制----引用计数 refermance counting

         也称保留计数,每个对象有个与之关联的整数,称为它的引用计数器或保留计数器。
当某段代码需要访问一个对象时,改代码将该对象的保留计数器值加1,表示“我要访问该对象”;
当这段代码访问结束时,将该对象的访问计数器值减1,表示“我不再访问该对象”。
档保留计数器值为0时,表示不再有代码访问该对象因此将被销毁,其占用的内存将被系统回收以便重用。Object-C自动向对象发送一条dealloc消息。
签名方法:
  • -(id)retain;当使用alloc 、new或者copy 方法创建一个对象时被设置为1,之后增加对象访问则向对象发送一条retain消息。
  • -(void )release;访问结束则需要向对象发送一条release 消息。
  • -(unsigned)retainCount; 销毁对象时需要获取当前对象的保留计数器值,发送retainCount获取当前值。
对象所有权
        当多个实体拥有某个特定对象时,对象的所有权就变得复杂了。
        编写内存管理的方法:
  • setEngine方法一
  • setEngine方法二
内存释放
  • 内存自动释放 
-(NSString *)description
    {
        NSString *desc = [someObject description];
        NSLog (@"%@",desc);
        [desc release];
    }
  • 自动释放池
临时对象
        如果你使用new、alloc或者copy方法获取一个对象,则需要安排该对象的销毁,通常使用release来实现:
NSMultableArry *array;
array = [[NSMultableArray alloc] init ];//count:1
//use the array 
[array release ]; //count:0


        如果使用任何其他方式获取一个对象,如arrayWithCapacity:方法、NSColor等,则不需要销毁该对象。
NSColor *color;
color=[NSColor blueColor ];
//count:1,autoreleased
//use the color




内存管理规则
当使用new、alloc或copy方法创建一个对象时,该对象的保留计数器值为1。不再使用则向该对象发送一条release或者autorelease消息销毁
的那个通过任何其他方法获取一个对象的时候,则假设该对象的保留计数器值为1being且被设置为自动释放,不需要执行任何操作来确保该对象被清理。(临时对象管理方法)
如果保留了某个对像,则需要(最终)释放或自动释放该对象。必须保持retain方法和release方法使用次数相等。


垃圾回收
       在Object-C 2.0中引入了自动内存管理机制,也称垃圾回收。这是一个可选择启动的功能:Build选项卡里面选择Required[-forjc-gc-only]选项即可。(“-forjc-gc”选项是为了是代码既支持垃圾回收又支持对象的保留和释放,例如两种环境都使用的库代码)
       启动垃圾回收后,通常的内存管理命令全都编程了空操作指令,不执行任何操作。Object-C的垃圾回收器是一种继承性的垃圾回收器,与那些已经存在了一段时间的对象相比,新创建的对象更可能被当成垃圾。垃圾回收器定期简称变量和对象以及他们之间的指针,档发现没有任何变量指向某个对象时,就将该对象视为应该被抛弃的垃圾。与自动释放池一样,垃圾回收器也是在事件循环结束时触发的。但是开发iphone软件则不能使用垃圾回收。
在编写Iphone程序的时候,建议不适用autorelease方法,同事时还要避免使用创建自动释放的对象的便利函数。

swift内存管理机制

     swift同样使用自动计数(ARC)会制动释放内存。swift有3种引用方式:

在实例的生命周期中,如果某些时候引用没有值,那么弱引用可以阻止强引用环。如果整个生命周期内引用都有值,那么相应的用无主引用,

  • 强引用         会增加实例的引用计数。
  • 弱引用         弱引用不会增加实例的引用计数,因此不会阻止ARC销毁被引用的实例。这种特性使得引用不会变成强引用环。声明属性或者变量的时候,关键字weak表明引用为弱引用
  • 无主引用     和弱引用相似,无主引用也不强持有实例。但是和弱引用不同的是,无主引用默认始终有值。


0 0
原创粉丝点击