• 属性设置@property之retain,assign,weak,strong,copy


    1.assign

    assign只是简单赋值,不更改索引计数,适用于基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)       

    2.copy

    copy用来建立一个索引计数为1的对象,然后释放旧对象, 常用语NSString ,指在赋值时使用传入值的一份拷贝。

    3.retain

    retain用来释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

    对其他NSObject和其子类,对参数进行release旧值,再retain新值。    

    retain的语法为:

    - (void)setName:(NSString *)newName { 
      if (name != newName) { 
           [name release]; 
           name = [newName retain]; 
        //注意: 把对象添加到数组中时,引用计数将增加对象的引用次数+1。
           // name’s retain count has been bumped up by 1 
        } 
    }

    4.copy与retain:

    Copy其实是建立了一个相同的对象,而retain不是:

    比如一个NSString对象,地址为0×1211,内容为@"str1",Copy到另外一个NSString之后,地址为0×2211,内容相同,新的对象retain为1,旧有对象没有变化,retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,同时建立一个指针指向原来的NSString,这个对象的retain值+1,可以说,retain是指针拷贝,而copy是内容拷贝。

    同样理解,retain的set方法是浅复制,而copy的set方法是深复制。

    5.assign与retain:

    assign就是直接赋值,从而可能引起1中的问题,当数据为int, float等原生类型时,可以使用assign。retain使用了引用计数,retain引起引用计数加1, release引起引用计数减1,当引用计数为0时,dealloc函数被调用,内存被回收。

    6.strong和weak

    6.1.strong和weak原理

    两者都是对象修饰词 ,用来修饰变量和指针,strong表示强指针,weak表示弱指针。

    假设创建person对象,此时计数器加一,release之后,计数器减1

    ARC中使用 强指针和弱指针来判断是否销毁

    对象创建以后默认情况下全是强指针 ,然而在创建对象的表达式前加上_weak修饰的时候表示对象为弱指针。

    内存中给person创建内存,指针指向person对象,arc判断原则,只要没有任何强指针指向对象,对象就会被销毁。使用strong和weak主要是防止出现内存泄露,死循环,还有就是节省内存。

    6.2 视图中插入控件为什么用weak?

          控制器里拖入控件的时候系统默认为weak,此时就会有人产生疑问,以为weak为弱指针,此时创建之后会很快会消除,这样会不会造成添加的控件也消除?然而并不会,因为控制器里有view和相应控件,view的父类UIview里有一个数组subview,将button创建在view上, view的subview就会有指针指向button,此时button继承自UIButton,即存在指针指向UIButton,所以weak并不会造成实质影响。没有button此时按钮照样起作用,因为只要view存在,则其button就存在,所以此时强弱指针并不会对程序造成影响,用弱指针的目的是为了及时清空内存,提高性能。

    6.3 代理控件用weak,代理为什么用weak

          代理方法如delegate,datasource使用的都是assign,为弱指针,比如在一个创建一个tableview,此时tableview指向UITableView,如果设置delegate方法,则存在一个指针指UITableviewController,然而tableview创建之后就在UITableviewController内,控制器拥有控件,此时,如果delegate如果使用强指针,则就会造成死循环。imageview,scrollview,collectionview同样的道理。

  • 相关阅读:
    【python】requests库
    pycharm新建项目时选择virtualenv的说明
    cookie、session、token
    读写锁--DEMO
    锁降级--防止线程安全问题
    mysql-left join
    index-document-shard
    ES-常见搜索方式
    SpringBoot在自定义类中调用service层等Spring其他层
    mongodb crud
  • 原文地址:https://www.cnblogs.com/xiejw/p/5143885.html
Copyright © 2020-2023  润新知