• ios高效开发二--ARC跟block那点事


    block是可以捕捉上下文的特殊代码块。
    block可以访问定义在block外的变量,当在block中使用时,它就会为其在作用域内的每个标量变量创建一个副本。
    如果通过self拥有一个block,然后又在block中改变了实例变量,就会出错。
    例如:
    1 self.block = ^(NSString *aString)
    2 {
    3     self.aLabel.text = aString;
    4 });
    这段代码中,self保留了block,同时block又保留了self,会引发循环保留。很危险。
    如果未使用ARC,可以使用__block和__unsafe_unretained来复制一个未保留的引用副本。
     1 //例如:(无ARC)
     2 __block id safeSelf = self;
     3 self.block = ^(NSString *aString)
     4 {
     5     safeSelf.aLabel.text = aString;
     6 });
     7  
     8 //(有ARC)
     9 __weak id safeSelf = self;        //ios 5
    10 // __unsafe_unretained id safeSelf = self; //ios 4
    11 self.block = ^(NSString *aString)
    12 {
    13     safeSelf.aLabel.text = aString;
    14 });
     
    在arc出现之前,我们可以自由的把CF*对象转成NS*对象,这称为自己桥接。用了arc之后,我们需要指定一个所有权转移修饰符。
    目前arc中提供的修饰符有:
    1.__bridge
    2.__bridge_retained
    3.__bridge_transfer
     
    第一个修饰符__bridge是一个普通的转换,表示不需要增加引用计数,不更改所有权。
    第二个是在转换C指针类型时,增加引用计数的值。
    第三个是把Core Foundation 指针类型转换成obj-c指针,变把引用计数值+1。如用Core Foundation 方法创建一个对象,并且要用arc来管理对象的内存,就可以用这个。
     
    arc移植的常见错误
    1.强制转换obj-c指针位C指针(或者反过来转换)
    2.在arc中把void*指针强制转成id类型(或者反过来转),如果要转,就必须是用修饰符
    例如: id selfPointer = (__bridge void *)self;
    3.在结构体或者(union)集合体中是用obj-c对象
    4.使用NSAutoreleasePool
  • 相关阅读:
    质量属性的六个常见属性应用场景(淘宝篇)
    软件架构师如何工作?
    寒假学习第十五天
    寒假学习第十四天
    ADMEMS方法体系:3个阶段,一个贯穿环节之Refined Architecture阶段阅读感悟
    《企业应用架构模式》阅读笔记一
    《重构:改善既有代码的设计》阅读笔记三
    大数据分析01——数据爬取
    《重构:改善既有代码的设计》阅读笔记二
    kettle--Trans插件之输出
  • 原文地址:https://www.cnblogs.com/wqxlcdymqc/p/3227099.html
Copyright © 2020-2023  润新知