又有点浮躁了,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.读写控制
(readonly、readwrite、setter、getter)
readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。
例如:@property(readonly)NSString *name;
//等价于- (NSString *)name;
readwrite,告诉编译器,既声明setter⼜又声明getter。
例如: @property(readwrite)NSString *name;
//等价于- (NSString *)name;
- (void)setName:(NSString *)name;
readwrite是读写性控制的默认设置。
2.原⼦子性控制
(nonatomic、atomic)
atomic。setter、getter⽅方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理。原⼦子性控制的默认设置是atomic
nonatomic。setter、getter⽅方法内部不会做多线程访问处理,仅仅是普通的setter、getter⽅方法 一般会使用这个,即使会用到关于线程的东西的时候我们也会通过控制线程的方式来实现,因为atomic太消耗内存了
3:语义设置(assign、retain、copy)
assign。setter、getter内部实现是直接赋值。(针对非对象类型 不如 int long NSInteger等)
例如:@property(nonatomic,assign)NSString *name; - (void)setName:(NSString *)name{
_name = name;
}
- (NSString *)name{ return _name;
}
retain。setter、getter的内部实现会做内存优化。(针对oc对象类型 也就是带*的)
例如:@property(nonatomic,retain)NSString *name;
- (void)setName:(NSString *)name{ if(_name != name){
[_name release];
_name = [name retain]; }
}
- (NSString *)name{
return [[_name retain]autorelease]
}
copy。setter、getter的内部实现也会做内存优化。
(如果属性是对象类型并且想得到参数的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];