- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
oc的@property关键字
一,基本概念:@property是编译器的指令; 编译器的指令即是用来告诉编译器要做什么。
1、@property告诉编译器声明属性的访问器(getter/setter)方法。
2、与@synthesize配对使用。xcode4.5以及以后的版本,@synthesize可以省略
好处:免去手工书写get和set方法繁锁的代码。
二、@property的用法
1、声明格式:@property 类型 方法名;
2、声明格式:@property (参数1,参数2....) 类型 方法名;
参数:1)原子性:atomic : 对属性加锁,多线程下线程安全,默认值;
nonatomic : 对属性不加锁,多线程下不安全,但速度快;
2)读写属性:readwrite : 生成getter、setter方法,默认值;
readonly :只生成getter方法
3)set方法处理:assign : 直接赋值,默认值;(适用于非oc对象类型)
retain : 先release原来的值,再retain新值;—>(在MRC中使用,适用于OC对象类型)
copy : 先release原来的值,再copy新值。(一般用于NSString)
weak: 弱指针—>(在ARC中使用,适用于oc对象类型,相当于MRC中的assign)
strong:强指针—>(在ARC中使用,适用于oc对象类型,相当于MRC中的retain)
3、修改set和get方法的名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用 在布尔类型中的getter。
@property(nonatomic,assign, setter=hh:,getter=ll)int age
可以理解为:[p setAge: ]------> [p hh:], [p age] ---------> [p ll];
@property(nonatomic,assign,setter=setVip:,getter=isVip)BOOLvip;
4、oc对象类型(非oc对象类型:直接赋值)
@property(retain)Car*newcar;
@property(weak)Car*newcar;
@property(strong)Car*newcar;
set方法:-(void)setCar:Car*newcar{
if(car!=newcar){ //判断是否有新对象
[car release]; //对旧对象release
car=[newcar retain]; //对新对象retain
} }
5、 @property(copy)Car*newcar;
set方法:-(void)setCar:Car*newcar{
if(car!=newcar){ //判断是否有新对象
[car release]; //对旧对象release
car=[newcar copy]; //对新对象copy
} }
例:
主函数:
#import <Foundation/Foundation.h>
#import "Clothes.h"
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Clothes *clo=[Clothes new];
Person *per=[Person new];
[per setClo:clo]; //将clothes给person—>strong
[per setClo1:clo]; //将clothes给person—>weak
clo.num=8001; //点语法赋值即[clo setNum:8001];
clo.num1=20; //生成set和get方法
//clo.num2=30; //此时会报错,没有生成set方法
int nu=clo.num2; //生成get方法
clo.name=@"以纯"; //assign直接赋值
clo.name1=@"羽绒服";//弱指针基本类型中直接赋值
clo.name2=@"秋衣"; //强指针基本类型中直接赋值
clo.name=@"玛丝菲尔";
[clo hh:80]; //用修改set方法名称进行赋值
[clo ll]; //用修改get方法名称获取值
[clo setVip:YES]; //设置值
BOOL Vip=clo.isVip; //获取值
BOOL Vip1=[clo isVip];//获取值
NSLog(@"衣服的品牌:%@\t衣服编号为:%d\t衣服的数量:%d\t衣服扣子数:%d",clo.name,clo.num,clo.num1,nu);
NSLog(@"1号衣服名:%@\t2号衣服名:%@\t衣服数量:%d",clo.name1,clo.name2,[clo ll]);
NSLog(@"%d\t%d",Vip,Vip1);
}
return 0;
}
clothes类声明:
@interface Clothes : NSObject
{
int _num;
}
@property int num; //会自动生成get、set方法
@property(nonatomic,readwrite)int num1; //生成get和set方法(默认的)
@property(nonatomic,readonly)int num2; //只生成get方法
@property(nonatomic,assign)NSString*name; //使用参数assign直接赋值
@property(nonatomic,weak)NSString*name1; //弱指针基本类型
@property(nonatomic,strong)NSString*name2; //强指针基本类型
@property(nonatomic,copy)NSString*name3; //copy
@property(nonatomic,assign, setter=hh:,getter=ll)int num3;//修改set和get方法的名称
@property(nonatomic,assign, setter=setVip:,getter=isVip) BOOL vip;//用于BOOL类型
@end
clothes类实现:#import "Clothes.h"
@implementation Clothes
@end
person类声明:
#import <Foundation/Foundation.h>
#import "Clothes.h"
@interface Person : NSObject
@property(nonatomic,strong)Clothes*clo;//弱指针oc对象类型
@property(nonatomic,weak)Clothes*clo1; //强指针oc对象类型
@end
person类实现:#import "Person.h"
@implementation Person
@end
- ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------