Objective-C 属性(property)*** 点语法

***今天主要学习的内容有 属性@property 点语法是今后我们经常用到的知识点,所以务必要对理解透彻, 不然还得返工的.

//属性:属性是OC定义的语法,为实例变量提供了setter和getter方法的默认实现.能在一定程度上简化程序代码,并且增强实例变量的访问安全性.

#pragma mark --属性--

属性的声明

@property NSString *name; //此方法是下面方法的结合.

- (void)setName:(NSString *)name;//setter方法的声明

- (NSString *)name; //getter方法的声明

属性的实现

@synthesize name = _name; //此方法是下面方法的结合.

- (void)setName:(NSString *)name

{

    _name = name; //setter的实现部分

}

- (NSString *)name

{

    return _name; //getter的实现部分

}

 

#pragma mark --属性的属性--

概念: OC提供属性的目的是为了简化程序员编码,为属性提供了一些"关键字"来控制setter,getter的实现细节,这些"关键字"我们成为属性的属性(attribute),(attribute)可以分为3类,我们一一的看一下.

第一类:读写性控制(readonly,readwrite,setter,getter)

readonly,是告诉编译器,只声明getter方法,没有setter方法.例如:

@property(readonly)NSString *name; //等价于下面一个

- (NSString *)name;

readwrite,是告诉编译器,即声明setter又声明getter.例如:

@property(readwrite)NSString *name; //等价于下面两个

- (NSString *)name; //getter的声明

- (void)setName:(NSString *)name; //setter的声明

readwrite是读写性控制的默认设置.

第二类:原子性控制(nonatomic,atomic)

1.atomic: setter,getter方法在多线程访问下是绝对安全的,即setter,getter内部做了多线程访问处理.原子性控制的默认设置是atomic.

2.nonatomic:setter,getter方法内部不会做多线程访问处理,仅仅是不同的setter,getter方法.

程序开发过程中,setter,getter处处都在用,如果使用atomic,需要不断的对setter,getter加锁解锁以保证线程的访问安全,会占用很多系统资源,降低系统性能,所以通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic. 通常例子为:

@property (readwrite,nonatomic)NSString *name;//等价于下面2.

- (NSString *)name;//getter的声明部分

- (void)setName:(NSString *)name;//setter的声明

第三类:语义设置 (assign,retain,copy)

1.assign: setter,getter内部实现直接赋值.例如:

@property(nonatomic,assign)NSInteger *age;//等价于下面

- (NSInteger *)age; //age的getter声明部分

-(NSInteger *)age  //age的getter实现部分

{

    reture _age;

}

- (void)setAge:(NSInteger *)age; //agesetter声明部分

-(void)setAge:(NSInteger *)age  //agesetter实现部分

{

    _age = age;

}

2.retain: setter,getter的内部实现会做内存优化.例如:

@property (nonatomic,retain)NSString *name;//等同于下面

- (NSString *)name; //name的getter的声明部分

- (NSString *)name  //name的getter的实现部分

{

    return [[_name retain]autorelease];

}

- (void)setName:(NSString *)name; //namesetter声明部分

- (void)setName:(NSString *)name  //namesetter实现部分

{

    if(_name != name){

        [_name release];

        _name = [name retain];

    }

}

3.copy: setter,getter的内部实现也会内存优化.例如:

@property(nonatomic,copy)NSString *name;

- (NSString *)name;//getter的声明

- (NSString *)name //getter的实现

{

    return [[_name retain]autorelease];

}

-(void)setName:(NSString *)name; //setter的声明

-(void)setName:(NSString *)name //setter的实现

{

    if(_name != name){

        [_name release];

        _name = [name copy];

    }

}

如果属性是非对象类型 (比如NSInteger,CGFloat以及C语言的int,float等)属性的语义设置都会使用assign.

如果属性是对象类型(比如NSString,NSArray等)属性的语义设置都会使用retain.

如果属性是对象类型并且想得到参数的Copy,那么就使用copy关键字.

#pragma mark --点语法--

什么是点语法: 点语法是Objective - C 2.0中定义的语法格式,提供了一种便捷的属性访问方式.

点语法的使用:凡是符合系统默认的setter,getter书写格式的方法都可以使用点方法. 例如:

[person setName:@"zhangSan"];可以等价写成

person.name = @"zhangSan";

NSString *name = [person name];可以等价写成

NSString *name = person.name;

属性是一对getter,setter方法,点语法是属性的另一种调用格式.

posted @ 2015-04-16 14:50  why2wm  阅读(128)  评论(0编辑  收藏  举报