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, 等)      ui

适用简单数据类型atom

2,retain:spa

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

 

3,copy:线程

用于非共享内存时,每一个指针有本身的内存空间

 

4,atomic//默认属性指针

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

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

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

 

 5,nonatomiccode

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

相关文章
相关标签/搜索