首页 > 代码库 > OC基础之-Property(属性)和点语法
OC基础之-Property(属性)和点语法
学习属性之前回忆一下之前学到的setter方法和getter方法:
(1)setter方法的作用:用来为单一的实例变量赋值(只能是一个实例变量,多了的叫做get方法)
(2)setter方法的写法标准: - 号方法, 无返回值, 名字以set开头+要设置的变量的实例变量名(首字母需大写):(setter方法有且只有一个参数)+参数的类型(和实例变量的类型相同)+参数名(和实例变量名相同)
(3)getter方法的作用:用来获取单一实例变量的值.
(4)getter方法的写法标准: - 号方法, 有返回值(返回值类型和实例变量类型相同) 方法名直接和实例变量名相同 无参数
当实例变量较多的时候,用setter方法和getter方法会很不方便,代码量也加大,所以就有了属性的出现.属性是OC2.0之后出来的新的语法,用来替代setter和getter方法,使用属性可以快速创建setter和getter方法的声明,以及setter和getter方法的实现.此外,属性还添加了对实例变量操作的安全处理.
(1)属性的写法标准: @property(用来定义属性) 属性的类型(和实例变量的类型相同) 属性名(和实例变量名相同)
(2)注意:@property 知识自动声明setter和getter方法的声明
属性的三大特性:
(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.
属性的实现:
(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文件中声明属性,其他的系统自动生生成.
点语法,是一种快速访问setter和getter方法的方式(类似于之前的结构体变量访问结构体成员)
写法标准:对象名.属性名 -----如果放在等号的左边,就是调用setter方法,其他情况都是调用getter方法
声明属性时默认生成对应的setter和getter方法,所以属性和setter及getter方法都有关联.