• [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
    如果一件事情你觉得难的完不成,你可以把它分为若干步,并不断寻找合适的方法。最后你发现你会是个超人。不要给自己找麻烦,但遇到麻烦绝不怕,更不要退缩。 电工查找电路不通点的最快方法是:分段诊断排除,快速定位。你有什么启示吗? 求知若饥,虚心若愚。 当你对一个事情掌控不足的时候,你需要做的就是“梳理”,并制定相应的规章制度,并使资源各司其职。
  • 相关阅读:
    SQL Server OPENQUERY使用
    VS2013程序打包报 ISEXP : error -****: An error occurred streaming
    IIS重新注册
    c#之反射(Reflection)
    c#之Lambda表达式
    c#之委托事件(DelegateEvent)
    c#之委托详解(Delegate)
    git将文件托管到github上遇到的问题
    c#之泛型详解(Generic)
    linux下操作memcache的操作命令
  • 原文地址:https://www.cnblogs.com/wvqusrtg/p/4502415.html
Copyright © 2020-2023  润新知