天天看点

黑马程序员——OC语言加强[email protected]参数

                                                                       ------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>