• [Objective-c 基础


    A.ARC的基本原理

    1.ARC的判断原则:只有没有强指针指向对象,就会立即释放对象
    注意,在以下情况,会立即回收内存:
    (1)指针超出作用域
    1     {
    2         Person *p1 = [[Personalloc] init];
    3         p1.name = @"p1";
    4         NSLog(@"1");
    5     }// 超出p1作用域,回收p1指向的空间
    6    
    7     NSLog(@"2");
    out:
    2014-11-21 00:14:59.980 01-autorelease基本概念[4282:263265] 1
    2014-11-21 00:14:59.981 01-autorelease
    基本概念[4282:263265] Person - p1被回收了
    2014-11-21 00:14:59.981 01-autorelease
    基本概念[4282:263265] 2
     
    (2)指针指向别的对象
    1     Person *p1 = [[Personalloc] init];
    2     NSLog(@"1");
    3     p1.name = @"p1";
    4     NSLog(@"2");
    5     p1 = [[Personalloc] init]; // p1指向了别的对象,原来指向的内存空间被释放
    6     NSLog(@"3");
     
    out:
    2014-11-21 00:10:52.263 01-autorelease基本概念[4248:261439] 1
    2014-11-21 00:10:52.264 01-autorelease
    基本概念[4248:261439] 2
    2014-11-21 00:10:52.264 01-autorelease
    基本概念[4248:261439] Person - p1被回收了
    2014-11-21 00:10:52.264 01-autorelease
    基本概念[4248:261439] 3
    2014-11-21 00:10:52.264 01-autorelease基本概念[4248:261439] Person - p2被回收了
     
    (3)指针置nil
    1     Person *p1 = [[Personalloc] init];
    2     p1.name = @"p1";
    3     NSLog(@"1");
    4     p1 = nil; // p1被置为nil,原来指向的内存空间被释放
    5     NSLog(@"2");
     
    out:
    2014-11-21 00:12:49.289 01-autorelease基本概念[4266:262528] 1
    2014-11-21 00:12:49.291 01-autorelease
    基本概念[4266:262528] Person - p1被回收了
    2014-11-21 00:12:49.291 01-autorelease
    基本概念[4266:262528] 2
     
    强弱指针:
    (1)强指针:使用_strong修饰, 默认情况下,所有指针都是强指针
    (2)弱指针:使用_weak修饰
     
     
    2.启动了ARC之后,@property属性不能使用retain了,retain用strong代替(不会报错,效果weak等同assign, strong等同retain)
    @property(nonatomic,strong)Dog*dog;
     
    有strong和weak两种指针类型可以选择
     
    3.ARC的特点
    (1)不允许调用release、retain、retainCount
    (2)允许重写dealloc,但是不允许调用[super dealloc],其实不重写其成员对象也会自动被释放
    (3)@property参数
    a.strong:成员变量是强指针,(适用于OC对象类型)
    b.weak:成员变量是弱指针,(适用于OC对象类型)
    c.assign:适用于非OC对象类型
     
    —》以前的retain改为用strong
     
    B.XCode的ARC转换
    1.重构转换
    Edit -> Refactor -> Convert to ARC for Objective c
    自动消除掉函数、dealloc中的release代码
     
    2.手动指定不需要使用ARC的代码文件
    项目 -> Build Phase -> 双击代码文件 -> 加入参数 “-fno-objc-arc”
    参数:
    (1)-fno-objc-arc:禁用ARC
    (2)-f-objc-arc:开启ARC
     
     
    C.循环引用
    互相使用strong引用的对象,不能被释放
    解决:其中一方使用weak引用,一方使用strong引用
    ——————Person.h———————
    1 @classDog;
    2 @interfacePerson :NSObject
    3 @property(nonatomic,strong)Dog*dog;
    4 @end
     
    ——————Dog.h————————
    1 @classPerson;
    2 @interfaceDog :NSObject
    3 @property(nonatomic,weak)Person*person;
    4 @end
     
    对比非ARC的解决方案:一方使用retain,另一方使用assign
     
  • 相关阅读:
    Linux下JDK的安装
    Docker 搭建 Maven 私服
    K8s 部署 PostgreSQL
    CentOS7 使用 kubeadm 部署 K8s(单机/集群)
    CentOS7 升级 Vim
    Go 函数详解
    CentOS7 安装 golang
    Redis 集群伸缩原理
    CentOS7 安装 Redis
    CentOS7 搭建 Redis 集群
  • 原文地址:https://www.cnblogs.com/hellovoidworld/p/4119378.html
Copyright © 2020-2023  润新知