Objective-c的属性

来源:互联网 发布:小米max2保护壳淘宝 编辑:程序博客网 时间:2024/05/16 04:38

一. property (属性)

在OC里, 为成员变量赋值的方法称作setter(设置器): -(void)set成员变量名; //首字母大写, 忽略下划线

读取成员变量值的方法称作getter(访问器): -(成员变量类型)成员变量名;

写法如下:

//setter方法完整内部实现

-(void)setSex:(NSString *)sex

{

   if (_sex != sex) {

        [_sexrelease];

       _sex = [sex retain];

    }

}

//getter方法内部实现

-(NSString *)sex

{

   return [[_name retain]autorelease];

}


property(属性)是Objective - C 2.0 定义的语法, 它的功能: 让编译器自动编写一对相应的方法声明(setter&getter), 自动添加一个成员变量. 这样不但简化了编写过程, 而且还增强了安全性.

  属性的声明(如):     @property (readwrite,nonatomic,retain)NSString *name;

属性的实现(如):  @synthesize name = _name;

二. 点语法

点语法是Objective - C 2.0 中定义的语法格式. 提供了一种便捷的属性访问方式. 属性是一对setter, getter方法, 点语法取代消息语法, 是属性的另一种调用格式.

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

如:

      Teacher *laoMeng = [[[Teacheralloc]init]autorelease];

        [laoMengsetName:@"老孟"];

        //[laoMeng setSex:@"不明"];

        laoMeng.sex =@"";      //点语法 相当于 语法糖  调用setter方法

       NSLog(@"%@", laoMeng.sex); //点语法调用getter方法

        //laoMeng.sex = @"不明"; 运行时会转变成 [laoMeng setSex:@"不明"];输出出来

   // 一般等号左面的.(点) 是调用setter方法  ,  等号右面的.(点)是调用getter方法

三. 属性(property)的特性(attribute)

属性的特性:Objective - C为属性提供了一些关键字, 用以控制setter&getter的实现细节, 这些关键字我们称为属性的特性(attribute), 一般分为三大类: 读写特性, 原子性, 语义特性.

1. 读写特性: 

readonly:只声明getter方法, 不能修改.  

readwrite:(默认设置) 既声明setter 又声明getter

2. 原子性: 

atomic(原子性): (默认设置) setter&getter方法在多线程访问下是绝对安全的, 即setter&getter内部做了多线程访问处理. 但反复的加锁解锁, 占用系统资源, 影响效率.

nonatomic(非原子性): setter&getter方法内部不会做多线程访问处理, 允许并发访问, 不安全, 但效率更高, 所以我们一般都使用非原子性.

3. 语义特性:(控制内部内存管理)

assgn:setter&getter内部实现是直接赋值. (属性是非对象类型int, float...)

retain:setter&getter的内部实现会做内存优化. (属性是对象类型NSString, Person...)

copy: setter&getter的内部实现也会做内存优化. (属性是对象类型并且想得到参数的COPY)

属性的具体实现*****这里是重点, 了解其原理.





0 0