美文网首页
iOS开发OC属性关键字

iOS开发OC属性关键字

作者: 心成则玲 | 来源:发表于2022-04-26 16:03 被阅读0次

    内存管理常用几种:assign、strong、weak、copy
    assign适用于基本数据类型,weak适用于NSObject对象,并且是一个弱引用
    strong
    strong是每对这个属性引用一次,retainCount就会+1,只能修饰NSObject对象,不能修饰基本数据类型。是id和对象的默认修饰符。如:

    @property (nonatomic, strong) UIButton *button; // 按钮
    @property (nonatomic, strong) NSString *string; // 字符串
    

    weak
    weak对属性引用时,retainCount不变,只能修饰NSObject对象,不能修饰基本数据类型。主要用于避免循环用,如:

    @property (nonatomic,weak) id<MyDelegate> delegate;
    

    assin
    assin可以修饰基本数据类型和NSObject对象,对这个关键字声明的属性操作时,retainCount是一直不变的,一直为1,只有主动调用release时,才会释放,如:

    @property (nonatomic, assign) Bool isBool; // 布尔值
    @property (nonatomic, assign) NSInteger interger;
    

    copy
    copy复制的意思,这个关键字类似strong,只能修饰NSObject对象,不能修饰基本数据类型。和strong不一样的地方时,copy后的对象,指针地址和之前不一样了,也就是说重新分配的一块内存,也就是所谓的深拷贝,这个关键字在用的时候,因为涉及到申请的内存空间,所以要少用,能用strong的地方都用strong,只有必须用copy才用copy,如:

    @property (nonatomic, copy) NSString *str; // 字符串
    @property (nonatomic, copy) MyBlock myBlock; // Block
    

    block在没有使用外部变量时,内存存在全局区,然而,当block在使用外部变量的时候,内存是存在于栈区,当block copy之后,是存在堆区的。存在于栈区的特点是对象随时有可能被销毁,一旦销毁在调用的时候,就会造成系统的奔溃,所以blcok要用copy关键字。
    atomic和nonatomic的区别
    在平时创建对象@property的时候,我们会有用到atomic和nonatomic,但两者的区别在哪里
    atomic

    1 是默认的
    2 对同一对象的set和get的操作时循序执行的
    3 速度不快,因为要保证操作整体完成
    4 线程安全,需要消耗大量系统资源来为属性加锁
    

    使用atomic并不能保证绝对的线程安全,对于要绝对保证线程安全的操作,还需要使用更高级的方式来处理,比如NSSpinLock、@syncronized等
    nonatomic

    1 不是默认的
    2 更快
    3 如有两个线程访问同一个属性,会出现无法预料的结果
    4 非线程安全,适合内存较小的移动设备
    5 在不添加atomic或nonatomic的情况下,默认的是atomic
    

    atomic修饰的属性,系统生成的getter/setter会保证get、set操作的完整性,不受其他线程影响。比如,线程A的getter方法运行到一半,线程B调用了setter,那么线程A的getter还是能得到一个完好无损的对象。
    nonatomic修饰的属性,不做保持getter完整性保证,但在运行速度上要比atomic快

    相关文章

      网友评论

          本文标题:iOS开发OC属性关键字

          本文链接:https://www.haomeiwen.com/subject/uksnertx.html