zoukankan      html  css  js  c++  java
  • iOS学习笔记---oc语言第九天

    初级内存管理

    iOS应用程序出现crash(闪退),90%以上是内存问题////其他:数组越界,方法只声明没实现

    内存问题体现在两个方面:内存溢出野指针异常

    内存溢出:程序运行超出内存上限

    野指针异常:对象空间已经被系统收回,仍然使用指针操作这块内存,代码量越大的程序,越难找出出现野指针的位置

    内存管理方式:垃圾回收(gc)     MRC(Manual Reference Count)     ARC(Auto Reference  Count)

    垃圾回收:程序员只需要开辟内存空间,不需要⽤代码显⽰地释放,系统来判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收的过程不需要写任何代码,由系统⾃动完成垃圾回收。Java开发中一直使⽤用的就是垃圾回收技术。

    Manual Reference Count,⼈⼯引用计数:内存的开辟和释放都由程序代码进⾏行控制。相对垃圾回收来说,对内存的控制更加灵活,可以在⾃己需要释放的时候及时释放,对程序员的要求较高,程序员要熟悉内存管理的机制。

    Auto Reference Count,⾃自动引⽤用计数:iOS 5.0的编译器特性,它 允许⽤用户只开辟空间,不用去释放空间。它不是垃圾回收!它的本质 还是MRC,只是编译器帮程序员默认加了释放的代码。

    iOS支持两种内存管理方式:ARC和MRC

    MRC的内存管理机制是:引用计数

    ARC是基于MRC的.

    影响引用计数的方法 +alloc   -retain   -copy     -release    -autorelease

    +alloc :开辟内存空间,让被开辟的内存空间的引用计数变为1,这是从0到1得过程

    -retain :引用计数加1,如果内存空间之前引用计数为1,retain之后变为2,如果引用计数为5,retain之后变为6

    -copy: 把某一内存区域的内容拷贝一份,拷贝到新的内存空间里 去,被拷贝区域的引⽤计数不变,新的内存区域的引⽤计数为1。

    -release:引⽤计数减1,如果内存空间之前引⽤计数为4,release之后变为3,如果之前引⽤计数为1,release之后变为0,内存被系 统回收。

    -autorelease:未来的某⼀时刻引⽤用计数减1。如果内存之前引⽤用计 数为4,autorelease之后仍然为4,未来某个时刻会变为3。

    dealloc

    -dealloc是继承⾃父类的⽅法,当对象引⽤用计数为0的时候,由对

    象⾃动调用。 我们可以在dealloc中打印⼀句话,验证对象引用计数是否降为0.

    - (void)dealloc{
        NSLog(@“%@被销毁了”,self);
        [super dealloc];
        

    }

    autoreleasepool的使用

    通过autoreleasepool控制autorelease对象的释放。

    向⼀个对象发送autorelease消息,这个对象何时释放,取决于 autoreleasepool。

        NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];

        Person *p = [[Person alloc]init];//retainCount为1

        [p retain];//retainCount为2

        [p autorelease];//retainCount为2 未来的某个时刻释放 [pool release];

        NSLog(@”%d”,[p retainCount]);//打印结果为1

        NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];和

        [pool release];就像一对括号,[xxx autorelease];必须写在两者之 间。

        [xxx autorelease];出现在了两者之间,pool就会把接收 autorelease的对象给保存起来(以栈的方式,把对象压⼊栈)

        当[pool release];的时候,pool会向之前保存的对象逐一发送 release消息(对象出栈,越晚autorelease的对象,越早接收 release消息)。

        在iOS5之后,不再推荐使⽤用NSAutoreleasePool类,使⽤用

        @autoreleasepool{}替代。

        之前写在NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];和[pool release];之间的代码,需要写在 @autoreleasepool{}的⼤大括号⾥里。

        出了大括号,⾃自动释放池才向各个对象发送release消息。

    内存管理原则

        引⽤用计数的增加和减少相等,当引⽤用计数降为0之后,不应该再使 ⽤用这块内存空间。

        凡是使用了alloc、retain或者copy让内存的引⽤用计数增加了,就需 要使⽤用release或者autorelease让内存的引用计数减少。在⼀一段代码内,增加和减少的次数要相等。

     copy

    -跟retain不同,⼀个对象想要copy,⽣生成⾃己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议⽽给对象发送copy消息,会引起crash。

  • 相关阅读:
    小小不爽一下
    银行家算法的讨论
    【转】C字符串处理函数的实现
    Oracle物理存储结构文件
    RAC和ASM环境下修改控制文件control file
    TNS01190: The user is not authorized to execute the requested listener comm (oracle”用户没有启动lisener的权限?)
    RAC环境ASM存储新增控制文件的方法
    Oracle RAC 修改 spfile 文件位置
    Rman通过duplicate创建standby
    rman恢复手册
  • 原文地址:https://www.cnblogs.com/limicheng/p/3823888.html
Copyright © 2011-2022 走看看