总结:继承、分类(Category、extension)、协议(protocol)
读写属性: (readwrite/readonly)
setter语意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各参数意义如下:
readwrite: 产生settergetter方法
readonly: 只产生简单的getter,没有setter。
assign: 默认类型,setter方法直接赋值,而不进行retain操作
retain: setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样
nonatomic: 禁止多线程,变量保护,提高性能
二、分类:有两种形式
第一种:类别(命名的分类) Category 它有.h和.m文件 (只能新添加方法)
第二种:类扩展(延展)(未命名的分类) extension 它只有.h文件 (可以添加方法和实例变量)
(1)特点:分类多用于没有源代码的类,分类可以提供类需要的所有方法,它扩展类的功能,一般分模块进行。当然,它在不修改原有类的基础上添加新的方法,正是因为它具有将一个庞大的类可以分模块实现的优点,才使得做项目时更有利于团队的合作。它在扩展现有类的方法时,不需要访问源码,也不需要创建子类,而且也不必实现分类中的所有方法,这是它与一般接口和协议的区别之处。当分类中的方法与类方法同名时,它会覆盖类中的方法,那么类的同名方法永远就执行不到。
(2) 过程:<1>类别Category的使用时,它有.h声明文件和.m实现文件,所有新添加的方法都放在.h文件中进行声明,然后再.m文件中根据自己的需要选择性的实现这些方法。切记,它只能新添加方法,而且都是公有的;<2>类扩展extension使用时,它只有.h声明文件,所有新添加的方法和实例变量都只能在类中分别进行实现和初始化。切记,它新添加的方法和实例变量都是类私有的,只能在本类中进行访问,访问方式为[self method],不然即使在其他的任何地方有这个类的对象也不能访问到。一般地,类扩展不单独作为一个文件,而是直接把它写入类的实现文件中实现即可。
(3)格式:头文件名 类名+分类名.h 例如:NSString+Math.h
<1>Category
@interface 类名(分类名) =========> .h声明文件
{
新添加的方法method;
}
@end
@implementation 类名 ==========>.m实现文件
{
实现新添加的方法method;
}
@end
<2> extension
@interface 类名() ============> .h声明文件
{
先添加的实例变量property;
}
//@property(参数1,参数2) 类型名 变量名;
新添加的方法method;
@end
(4)提醒:在类别中只能添加方法,方法都是公有的;在类扩展中,既可以添加方法,也可以添加实例变量,但是添加的内容都是类私有的,只能在类的内部访问。
三、协议(protocol)
(1)特点:协议多用在许多类同时使用相同的方法而且这些代码重复性很大的情况下,它会把这些重复的代码提炼出来放在一个协议里,供大家使用。它确实有些类似于java中的接口和C++中的纯虚函数的抽象类,它提供协议的规则,使用者只有遵从协议的规则才能使用它所提供的方法。当然这些方法在协议中它只是帮助进行了声明,并没有任何的实现。当使用者遵从这个协议并使用它的方法时,如果在类声明文件中方法都是默认的或者是@required时,那么在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。
(2)过程:它只有.h声明文件,它既可以作为一个单独的文件进行声明所提供的方法,也可以直接放在类声明文件中进行声明,一般采用后者进行声明。它的方法声明时有默认、@required、@optional三种情况。当使用前面两种时,在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。当它的方法没有@optional时,那么它就类似于接口中的abstract整个类是抽象的,是必须全部实现所有的方法的。
(3)格式: @protocol 协议名:<父类协议名> =======>放在类的.h文件中或者在自己的单独创建的.h文件中
{
method1;//默认的,类实现文件中必须要实现这个方法
@required
method2; //需求的,类实现文件中必须要实现这个方法
@optional
method3;//可选择的,使用者可以选择性的实现
}
@end
(4)应用:利用协议可以实现代理模式。也就是给类寻找委托人,帮助类完成一些功能,而类不用自己亲自去做。这种代理模式使得代码的灵活性提高,也降低了耦合性,不必向继承那样,因为父类和子类的耦合性太强,父类一变化,子类就也得跟着变化,太过麻烦。协议要求,不管使用者是谁,阿猫阿狗都行,只要遵从规则,就可以用协议的方法替类去完成委托的任务。类似于老板与秘书的关系:老板出差时,秘书给老板订票、订房;老板开会时,秘书就负责通知所有要开会的人。。。
(5)说明:协议也是可以继承的,就如所有类的根类是NSObject一样,协议的根类协议也是NSprotocol;满足协议规则的类,在类的后面跟上<协议名字>,例如:@interface Student:Person<协议名>