1. 类目的基本概念和用法
注意有两种创建方法,调用方式相同,符合继承特性。
类目可以弥补oc单继承的缺陷。更好的方法是用协议去代替。以下为类目和继承的对比。可以有一组,这里只写了一个作为示例。
@interface有三种类型:类、类目、延展。有时把类目写倒类里面去,有时单独提出来。如下示例,还可以接着往后面续,很想cpp的命名空间。里面可以任意写方法、成员变量等。类目就像变量名一样,是给方法取了一个名字便于区分。实际使用不会取访问。
重点:如果和原来的类里面名称重复会发生什么?类目优先级更高,会覆盖原来的。Fundation框架里面用的很多。
示例,转换数字为数组,注意这里的release的方法是在return的时候声明:
2. 延展的基本概念
类目就是括号里面有内容,延展就是只有括号没有内容,如同匿名的类目:
延展的声明、实现都是在m文件,对外是可见的。延展里面的私有方法(减号)被外部调用会报警告(新版本很有可能变了),但可以正常调用。
有时主要通过定义延展的方式定义类的私有方法。
和类目的区别:一个h文件声明,一个m文件里面声明。
3. 协议的基本概念和用法
协议看起来类似于类的接口 ,定义一组方法去让别的类实现。没有父类和实例变量。协议可以被任何类实现。oc是单继承的,协议可以弥补该缺陷。
类目也可以采用协议(不多)。
协议也是有基协议的,尖括号可以省略,基协议也可以被使用。下面示例中NSObject就是该协议的基协议。
@optional:采用该协议的类可以不用去实现的一组方法
@required:采用该协议的类必须要去实现的一组方法。
缺省的默认是required。
使用继承的方式去使用一个协议。
协议的主要作用是在设计模式中的应用(代理模式)。
其实就和多态的那一套很像,但是属于精简版的,类似于cpp中的纯虚基类。
下面是协议/代理的一些使用案例:
4. 代理设计模式
代理的类型是id自动类型,因为要实现的可以是各种类型。
初始化的时候设置好委托人。Person要找房子,Agent可以找房子,都要继承找房子这个协议。
以下是一个代理的实例:
main.m:
效果:jack一去找房子就会触发定时器去调用该方法。
Persion.h
用assign防止循环引用。这个人找的这个代理,要具备找房的能力。
Persion.m
更新initWithName方法,给delegate赋值,到此,初始化这个人的时候就设置好了委托人是谁:
注意,一定要设置代理
再给Persion加个定时器,每两秒钟去找一次房子,先加个私有方法startFindApartment:
加个参数:
定时器加在initWithName后面,NSTimer会返回NSTimer的实例:
userInfo这里的字符串可以传给startFindApartment函数。填nil吧还是。
如果tarrget填agent,那么可以去agent里面实现startFindApartment这个方法,就调到agent里面去了
上面不传参数了,改成如下方式,点击跳转的时候会有两个提示,一个是在协议里面的findApartment,一个是在agent里面的。
FindApartment.h(协议)
Agent.h
Agent.m