oc属性

又有点浮躁了,fk!!!

其实应该说是有点懒了,继续更新,今天更新的是属性

前几天更新过oc 的实例变量和setter 和 getter  方法,那么今天我们如果我们学会了属性,也就不需要自己在重新定义setter和getter方法了。 好下边上代码  还是以前几天 的 老师那个类为例子 当然了 这里的属性是要写在 头文件  .h里的


好,下边是代码

一  示例

 这是我们前几天实例变量的 代码  那么现在把下边的代码 变身   看我念一个咒语  &……*)……%¥

@interface Teacher : NSObject

{

    NSString *_name; //姓名   字符串类型 NSString

    NSInteger *_age; //年龄    整数类型 NSInteger

    NSString *sex;   //性别

}

那么施过咒语以后就是这个样子了:


@property (nonatomic,retain)NSString *name; //对象类型 retain 姓名

@property(nonatomic,assign)int age;   // 基本数据类型 assign  年龄

@property(nonatomic,retain)NSString *sex; // 性别



这个时候在.m文件里的 setter 和 getter方法 就可以删除了


然后在.m文件里可以写这么几段代码:(可以写在方法的 上边)


@synthesize name=_name;

@synthesize age=_age;

@synthesize sex=_sex;


接下来解释:

@property 与@synthesize配对使用。xcode4.5以及以后的版本,@synthesize可以省略 也就是说我们现在的xcode 可以省略@synthesize这个关键字

属性其实就是系统自动的给我们的实例变量增加了setter和getter 方法

比如当我们实例化出一个teacher 对象的 时候  可以利用 点语法给属性赋值  例如


  Teacher * t=[[Teacher alloc]init];

   t.name=@"老师a";   //相当于setter 方法   给name赋值

 还可以利用点语法把name取出来

 NSLog(@"name=%@",t.name); //相当于getter语法  取出name的值


这个时候可能你可能会有一个疑问就是 既然属性名没有“_” 下划线 那么 在初始化方法和便利构造器里边还会不会识别带下划线的实例变量?答案是识别  在便利构造器和初始化方法里 的 _name=name   这个是没有错的 因为 系统自动的给我们定义好了 所以以后就尽管用就行了

二 属性的属性

1.读写控制

(readonlyreadwritesettergetter)

readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。例如:@property(readonly)NSString *name;
//等价于- (NSString *)name;

readwrite,告诉编译器,既声明setter⼜又声明getter例如: @property(readwrite)NSString *name;
//等价于- (NSString *)name;

- (void)setName:(NSString *)name;

readwrite是读写性控制的默认设置。 

       2.原⼦子性控制

    (nonatomicatomic)

atomicsettergetter⽅方法在多线程访问下是绝对安全的,即settergetter内部做了多线程访问处理。原⼦子性控制的默认设置是atomic

nonatomicsettergetter⽅方法内部不会做多线程访问处理,仅仅是普通的settergetter⽅方法  一般会使用这个,即使会用到关于线程的东西的时候我们也会通过控制线程的方式来实现,因为atomic太消耗内存了

        3:语义设置(assignretaincopy)

assignsettergetter内部实现是直接赋值。(针对非对象类型  不如 int  long  NSInteger等)

例如:@property(nonatomic,assign)NSString *name;- (void)setName:(NSString *)name{

_name = name;

}

- (NSString *)name{return _name;


retainsettergetter的内部实现会做内存优化。(针对oc对象类型 也就是带*的)

例如:@property(nonatomic,retain)NSString *name;

- (void)setName:(NSString *)name{if(_name != name){

[_name release];

_name = [name retain];}

}

- (NSString *)name{
return [[_name retain]autorelease] 

}

copysettergetter的内部实现也会做内存优化。


(如果属性是对象类型并且想得到参数的copy,使⽤用copy关键字 )


例如:@property(nonatomic,copy)NSString *name;

- (void)setName:(NSString *)name{if(_name != name){

[_name release];

_name = [name copy];}

}

}

- (NSString *)name{
return [[_name retain]autorelease]; 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值