OC下retain copy nomatic等属性的解析

strong 和weak 是由ARC新引入的对象变量属性

xcode 4.2之前的版本使用的是retain和assign,是不支持arc的,xocde4.3之后,iOS(5)以上就有了ARC内存

管理机制,所以开始了使用

assign 用于非指针变量 例如nsinteger 和Int 等

@property (nonatomic, assign) int number; 

@property (nonatomic, assign) id className;//id必须用assign 

反正记住:前面不需要加 “*” 的就用assign吧 

retain用于指针变量 就是说你定义了一个变量,然后这个变量在程序的运行过程当中会改变,并且影响到其他方法

一般用于字符串 数组等

字典对象,视图对象(UIView ),控制器对象(UIViewController)等 

@property (nonatomic,retain) NSString * myString; 

@property (nonatomic, retain) UIView * myView; 

@property (nonatomic, retain) UIViewController * myViewController; 

xcode 4.2不支持ARC,所以会频繁使用retain来修饰,用完释放掉,而xcode4.3支持ARC,可以使用retian,不需要手动释放内存,系统会自动为你完成,如果你在xcode4.3上面开发,retian和strong都是一样的,没区别 

strong和weak: 

事实上 

@property(nonatomic,strong) MyClass *myObject;就是相当于@property(nonatomic,retain) MyClass *myObject;@property(nonatomic, weak )id<RNNewsFeedCellDelegate>delegate;就是相当于@property(nonatomic,assign )id<RNNewsFeedCellDelegate>delegate; 

现在系统自动生成的属性都是用weak来修饰的,我想应该是xcode 4.2不支持ARC,所以大家都是用retain。现在xcode4.3支持ARC了,于是苹果建议程序员放弃retain,以后都用weak。 

weak 就是相当于assign,同样可以在xcode4.3开发环境下放弃使用assign 使用weak 来代替 

unsafe_unretained 

copy属性 貌似是当一个属性继承自NSObject时,在定义属性时要用到copy


unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三个都是一个样的。 因为 ios5用的是 weak ,那在ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。说到底就是iOS 5之前的系统用该属性代替 weak 来使用。 

copy:这个东西估计是大部分人最不容易搞明白的东西,我也搞不明白。听别人说这个东西基本不用了,效果其实和retain没什么两样,唯一的区别就是copy只用于NSString而不能用于NSMutableString。 

不过好像当一个类继承NSObject,那么这个类里面的属性需要使用copy,比如: 

#import <Foundation/Foundation.h> 

#import <MapKit/MKAnnotation.h> 

@interface Annotation : NSObject <MKAnnotation> { 

        

        CLLocationCoordinate2D coordinate; 

        NSString *title; 

        NSString *subtitle; 

@property (nonatomic) CLLocationCoordinate2D coordinate; 

@property (nonatomic, copy) NSString *title; 

@property (nonatomic, copy) NSString *subtitle; 

@end 

反正以后就这么用就是了 

反正就记住一点:xcode4.2用retain和assign ;xcode4.3或以上版本用strong与weak 

nonatomic 

指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。 

atomic实在多线程的时候要用 比如说取数据时,有多个线程在对这个数据进行更改值 所以在取这个时,可以等全部线程执行完之后,在进行取值的操作 避免取值的时候出现错误 是原子类型的操作,因此,在多线程时,可以用,在单线程的时候,用nonatmic足矣

参考博客:http://lizhuang.iteye.com/blog/1989337

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值