Fork me on GitHub

第八讲.属性(@proporty,@synthsize) , 属性的attribute, 点语法,kvc

一.属性

   1>.属性为实例变量提供了setter,getter方法的默认实现. 使用@Property,@sythesize能在一定程度上简化程序代码,并且增强实例变量的访问安全性

    2>. 属性的声明:使用@property声明属性(例如:@property NSString *name;)  该关键字可以自动生成某个成员变量的setter和getter方法的声明

            相当于@interface中声明了两个方法:
                           - (void)setName:(NSString *)name;
                           - (NSString *)name;

       属性的实现:使用@synthesize实现属性(例如:@synthesize name = _name)
关键字帮助生成成员变量的settergetter方法的实现
           相当于@implementation实现了:
                    - (void)setName:(NSString *)name;
                    - (NSString *)name;

     属性的使用注意:首先,@properety和@sythesize配合使用,可取代setter/gstter的声明与使用.并且可以用","连用.  其次,最终可以简化成只有@property声明,就可以完成对整个setter/getter声明实现的全过程,但是注意这种方式生成的成员变量是private的。(@property int age;这句话完成了3个功能:1)生成_age成员变量的get和set方法的声明;2)生成_age成员变量set和get方法的实现;3)生成一个_age的成员变量)

     3>重命名setter和getter的方法

.h 文件内的重命名声明

 

main.m文件内的调用形式

 

 

实例:此实例在学习属性的同时,帮助回顾初始化,和遍历构造器的使用

Teacher.h文件

 

Teacher.m文件

 

main.m文件

 

 

 

 

二.属性的属性

 1 .可读性: readonly  、readwrite
   1>.@property(readwrite,....) valueType value;
   readWrite 属性是变量的默认属性,就是如果你(readwrite and readonly 都没有使用,那么你的变量就是readwrite属性),通过加入readwrite属性你的变量就会有get方法,和set方法。
   2>.property(readonly,...) valueType value;
这个属性变量就是表明变量只有可读方法,也就是说,你只能使用它的 get 方法。

main.m调用

 

  2.第二类.原子性控制(nonatomic  atomic)

     atomic : setter,getter方法在多线程访问下是绝对安全的,即setter,getter内部做了多线程访问处理,但是它需要对setter,getter加锁解锁以保证线程访问的安全,会很占用系统资源,降低系统性能.

     nonatomic : 通常设置为nonatomic,此为非原子性访问,不加同步,多线程并发访问会提高性能。在此方法中,setter,getter方法内部不会做多线程访问处理,仅仅是普通的setter,getter方法,nonatomic为默认的设置形式.
     注意点:  1>.如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级 。 所以 不加 nonatomic 对多线程是安全的   。

      2>.(nonatomic)非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。

     扩展:atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

3.第三类.语义设置( assign,retian,copy)

    assign   用于基本数据类型即非对象类型(如int,float等).此为默认设置形式.此方法对setter,getter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题.

    扩展:在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。

 

    retain:set方法的实现是release旧值,retain新值,所有实现都是这个顺序.用于OC对象类型(NSString ,NSSarray等)

    扩展:指定retain会在赋值时唤醒传入值的retain消息。此属性只能用于Objective-C对象类型,而不能用于Core Foundation对象。(原因很明显,retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数——译者注)。

 

     copy:set方法的实现是release旧值,copy新值,用于NSString、block等类型.,属性是对象类型并且想得到参数的copy,就是用copy关键字

        扩展:setter 方法进行 Copy 操作,与 retain 处理流程一样,先旧值 release ,再 Copy 出新的对象, retainCount 为 1 。这是为了减少对上下文的依赖而引入的机制。它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论.

附网文:
Retain vs. Copy
    copy  :   建立一个索引计数为 1 的对象,然后释放旧对象
    retain  :释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为 1
    Copy其实是建立了一个相同的对象,而 retain不是:比如一个 NSString 对象,地址为 0×1111,内容为 @”STR”Copy到另外一个NSString之后,地址为 0×2222,内容相同,新的对象 retain为1,旧有对象没有变化,   而retain到另外一个 NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值 +1.也就是说,retain是指针拷贝,copy是内容拷贝。

 示例代码:

 

assign,retain,copy方法实例应用(面试题)

 

 

 

三.点语法的使用

    1. 凡是符合系统默认的setter、getter书写格式的方法都可以使用点语法
    2. 例如:
      [person setName:@"小七"]; 等价于:person.name = @"小七";

      NSString *name = [person name]; 等价于:NSString *name = person.name;

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

    注意:只有在声明setter和getter(或@property,@sythsize)的基础之上才能使用点语法.没有相应的setter/getter声明不能使用点语法,因为点语法本质上只是的另一种调用形式.

示例代码:

 

重点理解和常见错误

 

 

 

四.KVC

   KVC(Key-Value-Coding),键值编码,是一种间接访问实例变量的方
法。 key:键,⽤用于标识实例变量 value:实例变量对应的值.

     核心关键语法: 1>.setValue: forkey:

                  2>.valueForKey:

 

 

 

   2>.当key不存在的时候,会执行setValue:forUndefinedKey:

    此种情况用于网络请求数据时,有时没有对应key值,所以为防止程序崩溃而使用,(只写格式就起作用)

 

 

posted @ 2015-08-31 21:06  DengHuiCheng  阅读(373)  评论(0编辑  收藏  举报