Objective-c 中@property中属性详解

原创 2017年01月10日 16:25:21

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


【iOS沉思录】深思Objective-C中的property属性

OC中的属性 属性(Property)是Objective-C语言的其中一个特性,它把类对象中的数据变量及其读写方法统一封装起来,是对传统C++中反复定义变量读写方法的一种封装优化,OC将这些变量封装...
  • cordova
  • cordova
  • 2016年11月22日 19:21
  • 1792

(译)Objective-C 类属性

翻译自:Objective-C Class Properties 译者:Haley_Wong由于Swift 3.0 出了太多令人兴奋的新特性,人们很容易忽略 Objective-C中的小改动。苹果展...
  • u011619283
  • u011619283
  • 2016年12月12日 09:12
  • 2071

iOS Block作为property属性实现页面之间传值

我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数据进行传递,往往这要比引用定义在别处的函数直观。另外,block的实现具有封闭性(clos...
  • Jingchuanhe
  • Jingchuanhe
  • 2016年11月03日 11:32
  • 831

spring .xml中bean下的property属性

//id:该bean的标识符 class:该bean对应的类路径 // 就是找当前配置文件里的bean 也就是id为aa的bean ...
  • zMengLei
  • zMengLei
  • 2014年02月20日 23:06
  • 3992

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

1,assign : 简单赋值,不更改索引计数 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此...
  • l_ch_g
  • l_ch_g
  • 2013年09月06日 13:46
  • 1956

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

这里讲得挺详细的: http://www.linuxidc.com/Linux/2014-03/97744.htm
  • Ashimar_a
  • Ashimar_a
  • 2015年12月18日 13:20
  • 216

iOS开发 Objective-C中@property的属性详解

1,assign : 简单赋值,不更改索引计数 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b。此时a 和...
  • syg90178aw
  • syg90178aw
  • 2015年07月29日 15:03
  • 308

@property属性关键字的作用

属性关键字的作用   现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码。因此在属性property中我们经常使用的关键字有strong,weak,assign,co...
  • MouXiaoxiong
  • MouXiaoxiong
  • 2016年09月12日 11:12
  • 1586

objective-c中property的属性

Property: 是Objective-C 2.0中新增加的語法。利用這個語法,在precompiler時會幫我們產生getter及setter。@property放在物件宣告的地方。基本語...
  • yaokang522
  • yaokang522
  • 2012年02月12日 15:42
  • 320

Objective-C中@property属性使用

@property declaration 属性 为实例变量指定属性(attributes)的途径, 可让编译好器生成 无泄漏和线程安全的访问实例变量的方法. @property 就是对应...
  • tonyXf121
  • tonyXf121
  • 2012年03月12日 08:37
  • 550
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-c 中@property中属性详解
举报原因:
原因补充:

(最多只允许输入30个字)