1 常用数据类型
1.1 @property参数
@property参数分4类
1、读写属性:(readwrite/readonly)
2、setter语意:(assign/retain/copy)
3、原子性:(atomic/nonatomic)
4、引用强弱:(strong/week)
1.1.1 readwrite
默认属性,将生成不带额外参数的getter和setter方法(setter方法只有一个参数)。
1.1.2 readonly
只生成get方法
1.1.3 retain
释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1。
例如:
@class Dog
@property(nonatomic,retain)Dog*dog;
注:nonatomic与atomic相对应,涉及线程,比较麻烦,这里不做赘述,读者仅需记住,nonatomic相对于atomic来说性能高,而声明属性时一般默认为atomic,故需在此申明nonatomic
这里使用了retain,那么在set方法中,究竟如何体现的呢?
- (void)setDog:(Dog *)dog
{
if(_dog !=dog){ //判断是否需要重新赋值
[_dogrelease]; //释放旧引用,计数器-1
_dog = [dogretain]; //重新赋值,计数器+1
}
}
1.1.4 assign
指定setter方法用简单的赋值,不更改索引计数(Reference Counting),这是默认操作。你可以对标量类型(如int)使用这个属性。你可以想象一个float,它不是一个对象,所以它不能retain、copy。
例如:
@property(nonatomic,assign)intcount;
这里使用了assign,那么在set方法中,究竟如何体现的呢?
- (void)setCount:(int)count
{
_count = count;
}
1.1.5 copy
指定应该使用对象的副本(深度复制),前一个值发送一条release消息。基本上像retain,但是没有增加引用计数,是分配一块新的内存来放置它。copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。copy: 建立一个索引计数为1的对象,然后释放旧对象,copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。
例如:
@property(nonatomic,copy)NSString* str;
这里使用了copy,那么在set方法中,究竟如何体现的呢?
- (void)setStr:(NSString *)str
{
if(_str != str){ //判断是否需要重新赋值
[_strrelease]; //释放旧引用,计数器-1
_str = [strcopy]; //重新赋值,使用copy
}
}
总结:
1.retain:先release旧值,再retain新值,在上例中_dog与dog最终指向同一块内存区域。
2.assign:直接赋值,不考虑内存管理。
3.copy:Copy其实是建立了一个相同的对象,而retain不是;比如一个NSString对象,地址为0×1111,内容为@”STR”;Copy到另外一个NSString之后,地址为0x2222,内容相同,新的对象retain为1, 旧有对象没有变化。
4.从retainassign copy的特点中我们可以看出:
retain一般适用于OC中的对象
assign一般适用于非OC对象,如int等普通类型
copycopy一个对象变成新的对象(新内存地址) ,引用计数为1,原来对象计数不变,copy一个对象变成新的对象(新内存地址),引用计数为1,原来对象计数不变。
1.1.6 atomic
对于对象的默认属性,就是setter/getter生成的方法是一个原子操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter的情况,相关于方法头尾加了锁一样。默认值,保持数据的原子性访问,类似锁。
1.1.7 nonatomic
不保证setter/getter的原子性,多线程情况下数据可能会有问题。nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。先释放原先变量,再将新变量retain然后赋值;非原子性访问,没加锁,但是提高访问速度,非多线程时访问数据时建议使用。
注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。
1.1.8 strong
强引用,ARC模式下与retain同作用,对象的retaincount自动加1
1.1.9 week
弱引用,ARC模式下与assign同作用,非对象类型使用。
1.2 enum枚举类型
iOS:枚举类型enum,NS_ENUM,NS_OPTIONS
http://blog.csdn.net/annkie/article/details/9877643
2 Catalog使用
2.1 注意问题
2.1.1 Catalog不应履行继承职责,即尽量不要重写源类继承自基类的方法
Catalog中如果重写基类方法的话,即使其他地方没有引用该类,系统照样会执行进入Catalog类方法中,代码超过了include类的执行范围,容易造成不可预知的异常。
例如:
#import "UIScrollView+UITouch.h"
@implementationUIScrollView (UITouch)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesBegan:touches withEvent:event];
[super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesMoved:touches withEvent:event];
[super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent*)event {
[[self nextResponder] touchesEnded:touches withEvent:event];
[super touchesEnded:touches withEvent:event];
}
@end
虽然其他类中没有引用UIScrollView+UITouch.h这个分类类,在触发touch操作时,代码依然会执行到这三个方法中来,因为这个catalog相当于替源类UIScrollView实现了继承的职责,实现了父类的touch方法。自然,就会执行到这个分类类中来,即使没有显式include这个catalog类。
3 参考链接
IOS开发@property中assign、copy、retain等关键字的理解
http://blog.csdn.net/cx_wzp/article/details/47416831
IOS内存管理retain,assign,copy,strong,weak
http://blog.csdn.net/hengshujiyi/article/details/25627131
(Good)Objective-C属性特性(assign , retain , copy , readonly, readwrite , atomic , nonatomic)
http://davychen.blog.51cto.com/3283671/652717
Objective-C的@property详解(ios,iphone,xcode,retain,release,assign,copy)