首页 > 代码库 > OC基础之-Property(属性)和点语法

OC基础之-Property(属性)和点语法

  1. 学习属性之前回忆一下之前学到的setter方法和getter方法:

    (1)setter方法的作用:用来为单一的实例变量赋值(只能是一个实例变量,多了的叫做get方法)

    (2)setter方法的写法标准: - 号方法,  无返回值,   名字以set开头+要设置的变量的实例变量名(首字母需大写):(setter方法有且只有一个参数)+参数的类型(和实例变量的类型相同)+参数名(和实例变量名相同)

    (3)getter方法的作用:用来获取单一实例变量的值.

    (4)getter方法的写法标准: - 号方法,  有返回值(返回值类型和实例变量类型相同)  方法名直接和实例变量名相同 无参数

  2. 当实例变量较多的时候,用setter方法和getter方法会很不方便,代码量也加大,所以就有了属性的出现.属性是OC2.0之后出来的新的语法,用来替代setter和getter方法,使用属性可以快速创建setter和getter方法的声明,以及setter和getter方法的实现.此外,属性还添加了对实例变量操作的安全处理.

    (1)属性的写法标准: @property(用来定义属性)   属性的类型(和实例变量的类型相同)  属性名(和实例变量名相同)

    (2)注意:@property  知识自动声明setter和getter方法的声明

  3. 属性的三大特性:

    (1)第一大特性:读写特性

         readonly   告诉编译器,属性在自动生成方法时,只会生成getter方法,不会生成setter方法

         readwrite  告诉编译器,属性在自动生成方法时,既要生成setter方法,也要生成getter方法,为系统默认的读写特性.

         setter = aa;  告诉编译器,当自动生成setter方法时,setter方法的方法名为指定的名字aa,而不采用默认的

         getter = bb;  告诉编译器,当自动生成getter方法时,getter方法的方法名为指定的名字bb,而不是采用默认的

    (2)第二大特性:原子性特性

         atomic : 原子特性,保证线程安全,内部做了安全处理(枷锁与解锁).为系统默认的原子特性.

         nonatomic : 非原子性,不保证线程的安全,因为对于setter和getter方法的使用,比较频繁,在一段时间内可能要多次访问,所以使用atomic会非常消耗系统的资源,降低程序的执行效率,使用nonatomic虽然不能保证线程的安全,但是一般情况下得使用都是安全的,所以对于原子特性,使用nonatomic

    (3)第三大特性:语义特性

         assign : 直接赋值,针对于基本数据类型使用,也可以针对对象类型使用,为系统默认的语义特性

         copy : 针对对象类型使用,并且要服从NSCopying协议的对象才可以,会复制出一个新的对象,拥有新的对象所有权(引用计数+1)(暂时理解到这里)

         retain : 针对对象类型使用,会造成对象的引用计数+1.

  4. 属性的实现:

    (1)写法标准:@synthesize  属性名  =  实例变量(指定的setter和getter方法内部所要操作的实例变量)

    (2)如果标准写法中指定的实例变量没有定义,系统会自动生成指定的实例变量,但是生成的实例变量是私有的,子类不能直接访问,如果实例变量想让子类访问,那么在.h文件中必须定义实例变量.

    (3)如果未指定setter和getter内部所要访问的实例变量时,系统会自动生成一个和属性名一样的实例变量.

    (4)对于setter和getter方法,如果我们实现了,系统就不会再自动生成

    (5)如果在.m文件中未通过@synthesize对属性进行合成,系统会自动合成,只不过此时系统默认的setter和getter方法内部所操作的实例变量是 _属性名

    (6)如果将@synthesize省略,我们自己实现setter和getter方法时,系统就不会生成对应的setter和getter方法,以及实例变量.

    (7)常用的是只在.h文件中声明属性,其他的系统自动生生成.

  5. 点语法,是一种快速访问setter和getter方法的方式(类似于之前的结构体变量访问结构体成员)

    写法标准:对象名.属性名   -----如果放在等号的左边,就是调用setter方法,其他情况都是调用getter方法

  6. 声明属性时默认生成对应的setter和getter方法,所以属性和setter及getter方法都有关联.