oc语言中@property的使用 Xcode4时,@property只能生成getter、setter方法的声明; 从Xcode5开始,@property 可以自动生成_propertyName成员变量和getter、setter方法的声明和实现。默认情况下,getter、setter方法作用于_propertyName变量。
@interface Circle : NSObject @property int pointX, pointY; @property double radius; @end @implementation Circle @end在这里甚至连 pointX,pointY属性都不用声明,在最新的xcode当中使用了 @property 基本数据类型名 变量面 语句就可以自动生成1._变量名的私有变量 //注意 这里是自动加了一个下划线的,实际上,私有属性的名字是什么已经不重要了,因为我们只能在外部通过setter和getter方法来访问到私有变量,通过的是方法名来访问,属性名已经无关紧要。 自动加载了变量的setter和getter方法 其中setter方法为
- (void)setPointX : (int)pointX { self->_pointX = pointX; }这里要注意 setter方法是命名会自动去掉变量的下划线 并且首字母自动转换为大写
getter方法为
- (int)pointX { return _pointX; }这里跟java不同的一点是 java的getter命名方法规范是getPointX 在oc里跟变量名一样 是pointX。 基本数据类型的使用比较简单,而针对对象的使用就稍微复杂一些。比如想声明一个NSString属性,并且让编译器自动加载setter和getter方法。就需要加入一些@property的属性来通知编译器进行一些列操作:@property(属性,属性。。。)NSString *变量名。(这里要注意的是,传入的属性数量没有硬性要求,一般是2-3个属性。) 代码如下
@interface Student : NSObject @property(nonatomic, copy, readwrite) NSString *name; @end @implementation Student @end下面是@property各属性的详解:
属性名作用atomic原子操作 线程安全 有枷锁解锁机制 安全 (默认)nonatomic声明一个非自己创建的对象的所有权,如果创建所有权之后 放弃只会放弃所有权,而不会释放内存 所有的都放弃所有权之后 系统会自动释放内存,防止A创建物体后B使用,A放弃了之后,B就再也找不到了这种情况。assign简单赋值,不需要更改索引计数。应用场合:对基础数据类型(例如NSInteger,CGFloat)和c数据类型(int,float,double,char 等)retain与strong对应,使用了引用计数,retain+1,retain-1;当引用计数retaincount=0时,delloc会被调用,内存释放copy用于非共享内存时,每个指针都有自己的内存空间,用于NSString对象指针。readwrite默认属性 有setter和getter方法,另外有readonly只读属性常用的有以上这些 详细参考@property属性详解