Objective-c - @property的参数

来源:互联网 发布:cf自动准备源码 编辑:程序博客网 时间:2024/04/28 03:52

/*

 Objective-c - @property的参数

 

    1> 回顾@property的功能:

        1,自动生成私有的带下划线的属性;

        2,自动的生成这个属性的setter/getter方法的声明;

        3,自动的生成这个属性的setter/getter方法的实现;

        

        setter的实现,直接赋值;getter的实现,直接返回.

        

        注意: 生成的是不含内存管理代码的setter方法.

 

        

    2> @property的参数:@property可以带参数,带不同的参数可以实现不同的功能.

 

        语法:@property(参数1,参数2,...)数据类型数据名称;

 

        1,与多线程相关的参数

 

        atomic :默认值.生成的setter/getter方法是很安全的方法,安全但是性能低下.

 

        nonatomic:生成的setter/getter方法不安全,但是效率高.

 

        (注意:推荐使用nonatomic,不写的话默认是atomic).


 

        2,与生成setter方法实现相关的参数

 

        assign:默认值.如果使用assign,生成的setter方法的实现中,就是直接将参数的值赋值给属性.

 

        retain:生成的setter方法中,是标准的MRC内存管理代码.如下:(YYCar *_car为例)

            - (void)setCar:(YYCar *)car

            {

                if(_car != car)

                {

                    [_car release];

                    _car = [car retain];

                }

            }

 

        (当属性的类型是oc对象的时候,就使用retain.当属性的类型是非oc对象的时候,就使用assign).

        (但是并不会在dealloc中也生成release代码,所以dealloc中的release需要自己去写).


 

        3,与生成只读,读写封装相关的参数

 

        readwrite:默认值.同时生成setter/getter方法.

 

        readonly:值生成getter方法,不生成setter.

 

 

        4,与指定生成的setter/getter方法的名称相关的参数

 

        setter:可以指定生成的setter方法的名称;

        语法:setter = abc,即生成的setter方法的名称是abc,: - (void)abc:(YYCar *)car;

 

        getter:可以指定生成的getter方法的名称;

        语法:getter = abc,即生成的getter方法的名称是abc,: - (YYCar *)abc;

 

        只有当属性的类型是BOOL类型的时候,我们可以修改getter方法的名称,以提高代码的阅读性:

        :@property(getter = isGoodMan) BOOL goodMan;

        :YYPerson *xiaoming = [YYPerson new];

           xiaoming.goodMan = YES;

 

            NSLog(@"%d", xiaoming.isGoodMan):

 

 

 注意:参数的顺序没有要求,同一组参数不可以同时使用.

 

 

 

 

 

 

 

 

 

 */

#import <Foundation/Foundation.h>


#pragma mark -

#pragma mark 车类的创建

//声明

@interface YYCar : NSObject


@property(nonatomic,retain)NSString *brand;

@property(nonatomic,assign)int speed;


- (void)run;


//自定义构造方法

- (instancetype)initWithBrand:(NSString *)brand;

- (instancetype)initWithBrand:(NSString *)brand andSpeed:(int)speed;


+ (instancetype)carWithBrand:(NSString *)brand;

+ (instancetype)carWithBrand:(NSString *)brand andSpeed:(int)speed;

@end


//实现

@implementation YYCar


//重写dealloc方法,监视车对象的回收

- (void)dealloc

{

    NSLog(@"%@释放了!",_brand);

    [super dealloc];

}


- (void)run

{

    NSLog(@"%@在行驶!",_brand);

}


//自定义构造方法

- (instancetype)initWithBrand:(NSString *)brand

{

    if(self = [superinit])

    {

        self.brand = brand;

    }

    return self;

}


- (instancetype)initWithBrand:(NSString *)brand andSpeed:(int)speed

{

    if(self = [superinit])

    {

        self.brand = brand;

        self.speed = speed;

    }

    return self;

}


+ (instancetype)carWithBrand:(NSString *)brand

{

    return [[selfalloc]initWithBrand:brand];

}


+ (instancetype)carWithBrand:(NSString *)brand andSpeed:(int)speed

{

    return [[selfalloc]initWithBrand:brandandSpeed:speed];

}



@end

#pragma mark -

#pragma mark 人类的创建

//声明

@interface YYPerson : NSObject


@property(nonatomic,retain)NSString *name;

@property(nonatomic,retain)YYCar *car;

@property(nonatomic,assign,getter=isGoodMan)BOOL goodMan;


- (void)drive;


//自定义构造方法

- (instancetype)initWithName:(NSString *)name;

- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car;

- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan;


+ (instancetype)personWithName:(NSString *)name;

+ (instancetype)personWithName:(NSString *)name andCar:(YYCar *)car;

+ (instancetype)persontWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan;

@end


//实现

@implementation YYPerson


//重写dealloc方法,监视人对象的回收

- (void)dealloc

{

    NSLog(@"%@释放了",_name);

    [_car release];

    [super dealloc];

}


- (void)drive

{

    NSLog(@"%@开去上学",_name);

    [_car run];

}


//自定义构造方法

- (instancetype)initWithName:(NSString *)name

{

    if(self = [superinit])

    {

        self.name = name;

    }

    return self;

}

- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car

{

    if(self = [superinit])

    {

        self.name = name;

        self.car = car;

    }

    return self;

}

- (instancetype)initWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan

{

    if(self = [superinit])

    {

        self.name = name;

        self.car = car;

        self.goodMan = goodMan;

    }

    return self;

}


+ (instancetype)personWithName:(NSString *)name

{

    return [[selfalloc]initWithName:name];

}

+ (instancetype)personWithName:(NSString *)name andCar:(YYCar *)car

{

    return [[selfalloc]initWithName:nameandCar:car];

}

+ (instancetype)persontWithName:(NSString *)name andCar:(YYCar *)car andDoodMan:(BOOL)goodMan

{

    return [[selfalloc]initWithName:nameandCar:car andDoodMan:goodMan];

}


@end


#pragma mark -

#pragma mark main函数

int main(int argc,const char * argv[]) {

    

    //创建人对象

    YYPerson *xiaoming = [YYPersonpersonWithName:@"小明"];

    xiaoming.goodMan = YES;

    NSLog(@"%@%@", xiaoming.name, xiaoming.goodMan ==YES?@"是一个好人":@"不是一个好人");

    

    //创建车对象

    YYCar *bz = [YYCarcarWithBrand:@"奔驰"andSpeed:120];

    

    //将车对象赋值给人的车属性

    xiaoming.car = bz;

    

    [xiaoming drive];

    

    [bz release];

    [xiaoming release];

    return 0;

}

1 0
原创粉丝点击