------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
@property参数
@propertyxcode4.4前
@property帮我们生成get和set方法的声明
我们自己实现 get和set方法
或者 @property 和@synthesize联合
@propertyxcode 4.4后
@property增强
@propertyint age;
1)生成一个_age
2)生成get和set方法的声明
3)生成 get和set方法的实现
@property (......)int age;
@property 参数(一)
格式:@property (参数1,参数2) 数据类型 方法名
参数类别 | 参数 | 说明 |
原子性 | atomic | 对属性加锁,多线程下安全,默认值 |
nonatomic | 对属性不加锁,多线程下不安全,但是速度快 | |
读写属性 | readwrite | 生成getter、setter,默认值 |
readonly | 只生成getter方法 | |
set方法处理 | assign | 直接赋值,默认值 |
retain | 先release原来的值,在retain新值 | |
copy | 先release原来的值,再copy新值 |
int _age;
@property (assign) int age;
-(void)setAge:(int)age{
_age = age;
}
Car_car;
@property (retain) Car *car ;
-(void)setCar:(int)car{
if(_car ! = car){
[_car release];
_car = [car retain]; }
}
1)内存管理相关参数
retain:对对象release旧值,retain新值(适用于OC对象类型)
assign:直接赋值(默认,适用于非oc对象类型)
copy:release旧值,copy新值
验证assign如果作用在对象上,实际上就是直接赋值
@property 参数(二)
1)是否要生成set方法(若为只读属性,则不生成)
readonly:只读,只会生成getter的声明和实现
readwrite:默认的,同时生成setter和getter的声明和实现
2)多线程管理(苹果在一定程度上屏蔽了多线程操作)
nonatomic:高性能,一般使用这个
atomic:低性能,默认
3)set和get方法的名称
修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。
@property(nonatomic,assign, setter=abc:,getter=haha)int age
可以理解为把[p setAge:]------>[p abc:], [p age] --------->[p haha];
@property(nonatomic,assign, setter=setVip:,getter=isVip) BOOL vip;
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property (nonatomic,assign,readonly) int tuiNum;
@end
@implementation Dog
@end
@interface Person : NSObject
@property (nonatomic,assign,setter=isVip:,getter=isVip) BOOL vip; //_vip
@end
@implementation Person
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *d = [Dog new];
// d.tuiNum ----> [d setTuiNum:4];
// d.tuiNum = 4; //调用set方法
NSLog(@"tuiNum = %d",d.tuiNum); //调用get方法
Person *p = [Person new];
[p isVip:YES];
if (p.isVip) {
NSLog(@"这时VIP客户");
}
}
return 0;
}</span>