• 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

  • 相关阅读:
    ABAP 更改DN外向交货单
    ABAP 参照SO item 创建DN
    ABAP 获取客户供应商的电话,地址,email等相关信息
    ABAP 自定义的ALV导出excel按钮,导出ALV内表中其中某几列的数据
    ABAP 后台JOB布置例子
    ABAP 选择屏幕字段动态隐藏和显示
    ABAP 选择屏幕上的导入模板下载按钮
    ABAP 选择屏幕文件导入时,单元格超50字符怎么处理
    ABAP 选择屏幕字段动态隐藏和显示
    人脸检测数据集
  • 原文地址:https://www.cnblogs.com/1023843587qq/p/4761976.html
Copyright © 2020-2023  润新知