- 1. 修改类源代码
- 2. 编写此类的子类
- 3. 类目(分类)(Category)文件名形如:NSString+CSayHi
- 4. 延展 (Extension)
- 5. 协议 (Protocal)
- 类目也称为分类、类别
- 可以为已知的类添加方法,哪怕是你没有源码的类
- 通过类目添加方法会成为原始类的一部分
- 与原类中的方法同级
- 会被子类继承
- 1. 可以扩展别人的类,可以作为子类的替代方式。
- 2. 把同一个类的代码放到多个文件中;便于多人协作。
- 注意:
- 不能在类目中添加 实例变量。可以添加属性@property,因为属性的本质是set、get方法。
- 可以为同一类添加多个类目,但类目名和方法名不能重复
- 不要随意重写类目中的方法
@interface ViewController ()//延展Extention
把延展的方法写这
@end
- 协议就是一套标准
- 协议只声明了方法,不具体实现,接受协议的对象(代理)负责实现
- OC的协议是由@protocol声明的一组方法列表
- 要求其它的类去实现,相当于@interface部分的声明
@end
3、协议可以专门创建一个 Protocol 格式的类文档 写协议内容
协议也可以直接写在调用协议的类的.h文件之中
4、协议的使用
(1)创建 Protocol 的类,设置协议内容
(2)创建代理类-》用 < > 使代理类获得协议内容 -》.m 中实现协议方法
(3)创建委托类-》声明delegate 属性 “代理”-》声明呼叫代理实现协议的方法-》.m 中实现呼叫方法
(4)使用代理,
导入委托、代理类的头文件。 假设:委托、代理类 分别是:WT、DL , WT的呼叫方法为sent
实例委托、代理的对象 WT * wt = [[WT alloc]init]; DL*dl = [[DL alloc] init];
将dl变成wt的代理 wt.delegate = dl;
有了代理dl后,wt可以呼叫dl履行协议了 [wt sent]; //其实是让代理去执行协议
@property (assign/*为什么做协议代理属性时不用内存管理 retain?*/,nonatomic) id<BoosAndSecretary> delegate;//创建代理用来调用协议
---拓展知识
OC中的循环引用问题
通过对OC语言的学习,我对循环引用的问题这样理解:
比如在main函数中创建了两个类的对象A和B,现在引用计数都是1。现在让A和B互相引用,现在两个对象的引用计数都增加了1,都变成了2。
现在执行 [A release]; [B release]; 此时创建对象的main函数已经释放了自己对对象的所有权,但是此时A和B的引用计数都还是1.因为他们互相引用了。
这时你发现A和B将无法释放,因为要想释放A必须先释放B,在B的dealloc方法中再释放A。同理,要想释放B必须先释放A,在A的dealloc方法中再释放B。所以这两个对象将一直存在在内存中而不释放。这就是所谓的循环引用的问题。
要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。
category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是category实现的m文件里面根本就没有生成这两个方法,所以你使用self.xxx时,会挂掉,错误提示:没有get/set方法。
你在category的m文件里面@synthesize 也无法声明,
也就是说,有声明,无实现。