现在的位置: 首页 > 综合 > 正文

Object-C属性访问

2013年10月12日 ⁄ 综合 ⁄ 共 1354字 ⁄ 字号 评论关闭

Object-c 2.0引入了属性的概念,使得我们可以通过点方法来访问对象的成员变量。假设有一个类为A, 该类有一个成员对象为mTestmTest是一个类型为B的对象,现在已经有了一个A类的实例对象为a,为了能够用a.mTest 这样的方式,我们需要做到以下两点:

        一、在头文件中用以下方式将mTest声明为属性

               声明属性的语法:@property 类型 名字

               比如我们可以这样写:@property(readwrite,nonatomic, retain) B *mTest;

               这样的声明,最容易让人迷惑的是类型部分,其实属性主要分为三类: 

              1. 读写属性(readwrite/ readonly

              默认为readwrite,表示该属性既可以读取,也可以给该属性变量赋值;readonly则表示只能读取该属性变量。

              2. 原子属性 (atomicity/nonatomic

              原子属性中,atomic是默认值,表示属性是原子的,支持多线程并发访问(在setter实现中加入了同步锁),后者是非原子的,适合在非多线程环境中提升效率,没有加入同步锁。

              3. Setter属性 (assignretaincopy

              如果属性是对象类型,你需要使用retain,assign,copy参数,表示setter方法内部实现的时候,持有对象的方式。其中retain就是增加引用计数,强引用类型。assign就是变量的直接赋值,弱引用类型,也是默认值。copy就是把setter的参数复制一遍,再赋给成员变量。 如果你不给出持有对象的方式,编译器就会给出警告。

             属性的setter类型与内存管理密切相关,要相当谨慎使用,很多内存错误以及程序的莫名其妙崩溃都是由于对属性的不正确使用造成的。

       二、在.m 文件中用以下方式合成对应的属性读取和设置函数

              @synthesize mTest;

              .m文件中有了上面这样一行,编译器就会自动合成getter函数,如果属性是可赋值的(即属性类型为readwrite),还会合成setter函数。编译器合成的getter函数名与属性名相同,合成的setter函数名则形如setMTest(即将属性的首字母大写)。

              实际上,我们也可以不用编译器来帮我们合成方法,自己来实现属性的存取方法。为了这样做,我们需要将@synthesize mTest; 这句去掉,同时在.m文件中实现以下两个函数:

 

  1. - (B *) mTest  
  2. {  
  3.      // .......  
  4. }  
  5.   
  6. void setMTest:(B*) b  
  7. {  
  8.      // .............  
  9. }  

             自己去实现存取方法是违背了属性的初衷的,一般不采用,给大家讲这个只是为了说明问题,仅此而已。

抱歉!评论已关闭.