• Objective-C中@property的所有属性详解


    1,assign :

    简单赋值,不更改索引计数

    假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和b指向同一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不知道b是否还在使用这块内存,如果a释放了,那么b在使用这块内存的时候会引起程序crash掉
     

    应用场合:

    对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等)     

    适用简单数据类型

    2,retain:

    与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,dealloc会被调用,内存被释放
     

    3,copy:

    用于非共享内存时,每个指针有自己的内存空间
     

    4,atomic//默认属性

    A,当一个变量声明为atomic时,意味着在多线程中只能有一个线程能对它进行访问

    B,当一个变量声明为atomic时,该变量为线程安全型,但是会影响访问速度,

    C,当一个变量声明为atomic时,在非ARC编译环境下,需要设置访问锁来保证对该变量进行正确的get/set
     

     5,nonatomic

    A,    当一个变量声明为nonatomic时,意味着多个线程可以同时对其进行访问

    B,    当一个变量声明为nonatomic时,它是非线程安全型,访问速度快;

    C,    当一个变量声明为nonatomic时,当两个不同的线程对其访问时,容易失控。
     

    总结:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:



    if (property != newValue) {  

        [property release];  

        property = [newValue retain];  

    }
     

    6.strong://ARC中默认属性,等于非ARC中的retain

    与retain相对应,

    应用场景:

    strong属性用于ARC中

    @property (strong,nonatomic) ViewController *viewController;
     

    7,weak:

    与assign 相对应,

    应用场景:

    用于IBOutlets,如,UIViewController的子类,即一般的控件。

    @property (weak, nonatomic) IBOutlet UIButton *myButton;

    strong与weak的区别举例:

    前提:

    我们把要用strong或者weak的对象比作一只风筝,风筝想挣脱线的束缚,自由飞翔去,如果此时有一根线,那么这只风筝就挣脱不了

    过程分析

    strong属性的变量:

    当我们把指向一只风筝的变量声明为strong时,此时,你就拥有控制这只风筝的线,假如此时有五个人同时控制这只风筝(即这只风筝对象有三个strong类型的变量指向它),那么只有一种情况,这只风筝才会挣脱掉线的束缚:这三个人都放掉手中的线,(release掉)

    weak属性的变量:

    当我们把指向一只风筝的变量声明为weak时,此时,就像站在旁边看风筝的观众们一样,当上面的三个人还握着手中的线时,他们只能看到风筝,并不能控制它,他们能做的只能是用手指指向风筝,并大喊,“看,那只风筝飞得真高!”,然而,当上面的三个人把手中的线都放掉时,此时,风筝飞走了,看不见了,不管有再多的观众,他们再也看不到风筝了,这个故事告诉我们一个道理:当strong类型的指针被释放掉之后,所有的指向同一个对象的weak指针都会被清零。

    8,readonly

    只有get方法,没有set方法

    9,readwrite//默认属性

    有get/set方法

    10,unsafe_unretauined

    用在ARC编译环境下,在此环境下,与assign相似。它只是告诉ARC如何正确地调用声明为unsafe_unretauined变量的retain和release

  • 相关阅读:
    (三十四)在所有的添加方法上记录一下(添加操作)
    (三十三)订单管理-修改订单状态
    (三十二)订单管理-查询订单详情
    (三十一)订单管理-查询订单
    (三十)商品管理-添加商品(上传图片)
    1.python的安装
    require(): open_basedir restriction in effect. File(/www/wwwroot/xcx/zerg/thinkphp/start.php) is not within the allowed path(s): (/www/wwwroot/xcx/zerg/public/:/tmp/:/proc/) in /www/wwwroot/xcx/zerg/p
    phpstorm-xdebug的安装
    swoole在线聊天学习笔记
    18.swoole学习笔记--案例
  • 原文地址:https://www.cnblogs.com/vijozsoft/p/5098909.html
Copyright © 2020-2023  润新知