oc 关于属性声明

1.在obj2.0中可以声明属性让编译器自动合成settergetter方法:


所用关键字:@property@synthesize。二者需要配对使用。@property是在头文件的类中对settergetter方法进行声明的,而@synthesize是在.m文件内对声明的方法进行实现的,格式如下:

@synthesize  成员名1,成员名2,,,

   而在对应的.h文件中@property的使用方法如下:@property(属性参数1,属性参数2) 成员类型   成员名 

property的属性参数有atomicnonatomicassignretaincopystrongweak等属性,具体介绍如下:

1atomic//默认属性

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

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

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

setter函数中设置访问锁格式如下:{lock}

if(property!=newvalue)

{

[property release];

property=[newvalue retain];

}

{lock}

2nonatomic

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

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

C:当一个变量声明为nonatomic时,当两个不同的线程对其访问时容易相互等待造成死锁。

注意:因为手机内存有限,几乎不用多线程,所以在iOS开发中,多用nonatomic属性(需手动添加)来提高访问速度


atomic:线程安全,需要消耗大量的资源

nonatomic:非线程安全,适合内存小的移动设备

 iOS开发的建议

所有属性都声明为nonatomic

尽量避免多线程抢夺同一块资源

尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力

3assign 默认属性

简单赋值,不需要更改索引计数。应用场合:对基础数据类型(例如NSIntegerCGFloat)和c数据类型(intfloatdouble,char 等)


4retain (引用)

strong对应,使用了引用计数,retain+1retain-1;当引用计数retaincount=0时,delloc会被调用,内存释放。retain实际就是(指针拷贝,引用计数器加一),对于对象1指针=[对象2指针  retain]”的方式赋值,表示将对象2的指针拷贝一份赋给对象1指针,对象1与对象2共有的计数器变量 加一 retaincount++;

[对象1.retaincount]=[对象2.retaincount]=retaincount++。对于所有用retain方式赋值的对象,他们共享同一个引用计数器,表示一共有几个指针同时使用(指向并绑定)一个公共对象。用一句话概括:retain就是利用指针拷贝和引用计数的方式将多个指针绑定到同一资源(对象)上。对于@property中的retain属性的自动调用过程就是先将一个对象释放引用(调用release)一次,再进行以上的retain方式赋值。retain的应用场合是对应于一般的Object,例如NSObject等。(注意:调用release(以[指针 release] 的方式)释放值为nil的未初始化指针或者被赋过nil值的指针不会出现错误)

5copy

5copy

用于非共享内存时,每个指针都有自己的内存空间,用于NSString对象指针。在@property中使用属性copy时,先将一个对象(假设为A指针)release一下(引用释放一下),再为它开辟一块和另一个对象(假设为B指针)指针指向的内存同样大小的内存空间,把这片新开辟内存的首地址赋给A进行绑定,把B指向堆空间的内容写进A指向的内存,并把新的对象指针A的引用计数器赋值为1,而B的不变。换句话就是赋值后,赋值对象B无任何改变,被赋值的新对象指针A被赋新的值绑定了新的且和赋值对象指针B指向堆空间内容完全相同的堆空间,并把计数器retain1

注意:retaincopy的区别就是:


copy其实是建立了一个相同的对象,而retain只是保存其对象,并且其计数值+1

例如:一个NSString对象,地址为0×1000,内容为@”string”

copy到另外一个NSString之后,地址为0×2000,内容相同,新的对象retain1,旧有对象没有变化

retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,但是这个新对象的retain+1,并释放旧的对象。

也就是说,retain是指针拷贝,copy是内容拷贝


6readonly

此关键字代表设置属性的setter方法不会被生成,所以它不可以和resign/copy/assign  组合使用

7readwrite 默认属性    settergetter方法

9strong weak

strongARC环境下的默认属性,二者都为ARC新引入的对象变量属性。strong相当于retainweak相当于assign

ARC引入了新的对象的新生命周期限定,即零弱引用。如果零弱引用被deallocated的话,零弱引用的对象指针会被设置为nilweakassign多了一个功能,当对象消失后自动把指针变成nil

20150810202935296.png

3. 如果实现了了@property@synthesize,就不需要再手动的提供settergetter方法了。实现了@property@synthesize相当于为指定的成员变量声明并实现了方法名为“-(void)set+成员名其首字母大写:(成员类型)参数名

setter方法和“-(成员类型)成员名getter方法。   例如假设有成员变量int age;假设为它实现了自动settergetter方法,就相当于声明并实现了”-(void)setAge:(int) _age“setter方法和“- (int)age ”getter方法。

4.  在类声明中的{}内如果声明了某成员变量,在{}之外如果用@property对该成员变量进行set/get方法声明实现时,表示的就是对已有成员进行方法设置。如果{}内没有声明该成员变量的话,就表示@property先为类声明了一个成员变量,然后再为其提供set/get的方法声明。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值