标签:
#import <Foundation/Foundation.h> #define PI 3.14159 @interface Circle : NSObject
@property(nonatomic)float r; -(float)length; -(void)setLength:(float)length;
@end
#import "Circle.h" @implementation Circle -(float)length { return self.r * 2 * PI; } -(void)setLength:(float)length { self.r = length / (2 * PI); } @end
-(instancetype)init { if (self = [super init]) { self.name = @"aaa"; _sid = 10000; //这个带下划线的变量仅仅是本类的变量,父类的变量是访问不到的,若要访问父类的变量,要向上一行那样 } return self; }
几个关键字的区别:
1.可读性:readonly 、readwrite(默认)@property(readwrite,....) valueType value;这个属性是变量的默认属性,通过加入readwrite属性你的变量就会有get方法,和set方法。@property(readonly,...) valueType value;这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的get方法。2.assign(默认)setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题应用场合:对基础数据类型 (例如NSInteger,CGFloat)和C数据类型(int, float, double, char, 等),不存在所有权关系的对象,比如常见的delegate。3.retainsetter方法对参数进行release旧值再retain新值与strong相对应,使用了引用计数,retain+1,release -1;当引用 计数为0时,内存被释放,如下代码所示:-(void)setName:(NSString*)_name{ //首先判断是否与旧对象一致,如果不一致进行赋值。 //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。 if ( name != _name){ [name release]; name = [_name retain]; } }4.copy与strong类似,但区别在于copy是两块内存,而strong是传了对象的指针,操作的是一块内存应用场合:NSString,NSArray,都要用copy修饰(这里举个例子来说明:如果将NSMutableString传给NSString,操作同一块内存的话,NSMutableString改变会影响NSString,是有风险的)5.strong与weak是由ARC新引入的对象变量属性,ARC引入了新的对象的新生命周期限定简单讲strong等同retain
weak比assign多了一个功能,当对象消失后自动把指针变成nil,好处不言而喻6.atomic(默认)与nonatomicatomic:atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率。nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。
标签:
原文地址:http://www.cnblogs.com/amazinglin/p/4883712.html