zoukankan      html  css  js  c++  java
  • Objective-C(内存管理)

    引用计数器

    每个OC对象都有一个占4个字节存储空间的引用计数器

    当使用或创建一个对象时,新对象的引用计数器默认是1 

    retain:可以使引用计数器+1

    release:可以是引用计数器-1

    retainCount:获得当前的引用计数器的值

    当对象被销毁时,会重写dealloc方法

    -(void)dealloc

    {

      // 这句必须放在最后面

      [super dealloc];

    }

    僵尸对象:所占内存已经被回收的对象,僵尸对象不能再使用

    野指针:指向僵尸对象(不可用的内存)的指针

    错误:EXC_BAD_ACCESS :访问了一块坏的内存(已经被回收,不可用的内存)

    空指针:没有指向任何东西的指针(储存的是nil、NULL、0),给空指针发消息不报错

    多对象内存管理

    1. 当使用(占用)某个对象就应该让对象的引用计数器+1

    (让对象做一次retain操作)

    2. 当不使用(占用)某个对象就应该让对象的引用计数器-1

    (让对象做一次release操作)

    3.谁retain,谁release

    set方法的内存管理

    内存管理代码规范:

    1. 只要调用alloc,必须有release(autorelease),对象不是用alloc产生的,就不要写release

    2.set方法的代码规范

    1》基本数据类型:直接赋值

    - (void)setAge:(int)age

     { 

        _age = age;

     }

     2> OC对象类型

     - (void)setCar:(Car *)car

     {

        // 1.先判断是不是新传进来对象

        if ( car != _car )

        {

            // 2.对旧对象做一次release

            [_car release];

            // 3.对新对象做一次retain

            _car = [car retain];

        }

     }

     3.dealloc方法的代码规范

     1> 一定要[super dealloc],而且放到最后面

     2> 对self(当前)所拥有的其他对象做一次release

     - (void)dealloc

     {

        [_car release];

        [super dealloc];

     }

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

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

     * assign : 直接赋值(默认,适用于非OC对象类型)

     * copy   : release旧值,copy新值

     2.是否要生成set方法

     * readwrite : 同时生成setter和getter的声明、实现(默认)

     * readonly  : 只会生成getter的声明、实现

     3.多线程管理

     * nonatomic : 性能高 (一般就用这个)

     * atomic : 性能低(默认)

     4.setter和getter方法的名称

     * setter : 决定了set方法的名称,一定要有个冒号 :

     * getter : 决定了get方法的名称(一般用在BOOL类型)

    @property 参数

    OC对象类型:

    @property (nonatomic, retain) 类名 *属性名;

    @property (nonatomic, retain) Car *car;

    @property (nonatomic, retain) id *car;

    非OC对象类型

    @property (nonatomic, assign) 类型名称 属性名;

    @property (nonatomic, assign) int age;

    @class Person;

     @class的作用:告诉编译器,Person是一个类

    开发中引用一个类的规范

    1. 在.h文件中用@class来声明类

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

    两端循环引用解决方案:

    1》一端用retain

    2》一端用assigh

    autorelease

    在ios程序运行过程中,会创建无数个池子,这些池子都是以棧结构存在(先进后出)

    当对象调用autorelease方法时,会将这个对象放到棧顶的释放池

    1. autorelease方法会返回对象本身

    2. autorelease会把对象放到一个自动释放池

    3. 当自动释放池被销毁时,会对池子里的所有对象做一次release操作

    iOS 5.0 开始如下创建释放池:

    @autoreleasepool

    {// {大括号开始时就创建来自动释放池

    } // }大括号结束代表销毁释放池

    autorelease的使用注意:

    1. 占用内存较大的对象不要使用autorelease

    2. 占用内存较小的对象使用autorelease,没有太大影响

    系统自带的方法里没有包含alloc、new、copy,说明返回的对象都是autorelease的

    NSString:NS是前缀,Next Step 

    开发中经常会提供一些类方法,快速创建一个已经autorelease过的对象

    例:

    + (id)Person

    {

        // 创建对象时不要直接用类名,一般用self

      return [[[self alloc] init] autorelease];

    }

    ARC

    Automatic Reference Counting

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

     1.ARC特点

     1> 不允许调用release、retain、retainCount

     2> 允许重写dealloc,但是不允许调用[super dealloc]

     3> @property的参数

      * strong :成员变量是强指针(适用于OC对象类型)

      * weak :成员变量是弱指针(适用于OC对象类型)

      * assign : 适用于非OC对象类型

     4> 以前的retain改为用strong

     指针分2种:

     1> 强指针:默认情况下,所有的指针都是强指针 __strong 下划线下划线strong

     2> 弱指针:__weak  下划线下划线weak

    错误写法(没有意义的写法):

        __weak Person *p = [[Person alloc] init];

    当两端循环引用的时候,解决方案:

     1> ARC

     1端用strong,另1端用weak

     2> 非ARC

     1端用retain,另1端用assign

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/1023843587qq/p/4761976.html
Copyright © 2011-2022 走看看