zoukankan      html  css  js  c++  java
  • IOS基础之 (十一) 内存管理 ARC

    一 内存管理

    1. set 方法内存管理的相关参数

      retain: release旧值,retain新值(值适用于OC对象)

      assign:直接赋值(set方法默认,适用于非OC对象类型,即基本数据类型,也包括枚举和结构体)

      copy : release 旧值, copy 新值(NSString)

    2. 是否生成set方法

      readWrite: 读写(同时声明和实现 setter, getter,默认) 

      readonly:只读(只会生声明和实现getter方法)

    3.多线程管理

      nonatomic:性能高

      atomic:性能低(默认使用这个)

    4. setter和getter方法的名称

      setter:给set方法改个名字,一定要有冒号( : )

      getter: 给get 方法改个名字(BOOL类型用的较多)。

    @property [getter=isRich] BOOL rich;

    二 模型类

    模型就是用来装数据,就是一个存放数据的类,就叫做模型类。

    发微博的人: 名字,微博账号,密码,头像,性别, 生日

    发的微博: 写微博的人,微博内容, 标题,微博图,转发微博,被评论, 被转发

    三 循环引用

    循环引用:你引用我,我引用你

    1. @class的作用:仅仅告诉编译器有这么一个类,并不知道里面有什么。

        @class person 告诉编译器有person这个类,

    2.开发中引用一个类的规范。

      在.h文件中用@class声明。

      在.m文件中用#import来包含类中所有的东西。

    3.为什么要用@class?

      @class和性能有关,可以循环引用,还可以提高编译效率。

      @import作用是拷贝。

     4.两端循环应用的解决方案

      一端用assign ,另一端用 retain。

    四 autorelease基本使用法

    1.首先把一个对象发到池子中。

    2.当自动释放池被销毁时,会对里面的对象做一次release操作

    3.返回对象本身。

    4.调用完autorelease后,对象的计数器是不变,不会对它减一。

    5.如果调用了两次 autorelease后,会报错,野指针错误。

    autorelease的好处

       不用再去关心对象的释放时间

       不在关心什么时候去调用release.

    autorelease使用注意:

       占用内存较小的对象不在随便的使用 autorelease.

    错误写法:

        如果调用了两次autorelease,会报错,野指针。

    @autoreleasepool{
       //这样写是错误的,在面试中常见
       Person *p = [[[[Person alloc]init]autorelease]autorelease];
    }

    内存管理总结:

    1. 计数器的操作

       retain   +1

       release  -1

       retianCount 获得计数器

    2. set方法的内存管理

    - (void)setCar: (Car *) _car{
        if( _car != car){
             [_car release];
           _car = [car retain];
        }
    
    }

       dealloc 方法的实现

    - (void)dealloc(){
       [_car release];   
       [super dealloc];
    }

     3 @property参数

      OC对象类型

     非OC对象类型

    ARC : ARC是编译器特性。当编译器发现 retian 或者 alloc,自动帮我们插入代码(release)

    ARC的判断准则:只要没有强指针指向对象,对象就会被释放。

    强指针:默认情况下都是强指针。__strong 是双下划线。

    __strong Person *p2 = [[Person alloc]init];

     弱指针:__weak 

    __weak Person *p = [[Person alloc]init];
    NSLog(@"%@" , p); //错误的写法

     两端循环引用的时候:

    ARC:

       一端用strong,另一端用weak。

    非ARC:

        一端用retain,另一端用assign。

      

     参考资料:

    http://www.cnblogs.com/silence-wzx/p/5140978.html

    http://www.cnblogs.com/wxios/articles/4175468.html

    http://www.cnblogs.com/chars/p/5232109.html

      

  • 相关阅读:
    mybatis05--多条件的查询
    mybatis04--Mapper动态代理实现
    mybatis03--字段名和属性名不一致
    mybatis02--增删改查
    myBatis01
    hibernate12--缓存
    hibernate11--Criteria查询
    hibernate10--命名查询
    hibernate09--连接查询
    (转载)閱讀他人的程式碼(5)找到程式入口,再由上而下抽絲剝繭
  • 原文地址:https://www.cnblogs.com/wangshuo1/p/ios-11.html
Copyright © 2011-2022 走看看