• 本章总结内容有:
1.ARC/MRC转换.
2.分类.
3.类扩展.
4.SEL.
5.block.
6.协议.
7.代理
• 【1】ARC 与 MRC
• MRC项目 转 ARC项目
• Edit -> Refactor-> Convert to Objective-C ARC
• MRC 与 ARC 共存
• 选中项目跟节点 -> 选中target -> BuildPhases->Compile Sources (1 item) ->在需要设置为不使用ARC文件所在的行与complier Flags的列 的交汇处双击,写上命令 -fno-objc-arc
• 【2】分类
• 【*】作用:扩充原有类的功能
• 【*】 定义
• 名称:原有类的名称 (分类名称)
• 文件名称:原有类的名称 + 分配名称
• 【*】优点
• 代码模块化
• 团队协作
• 可以扩充系统自带类的功能
• 【*】使用
• 在分类中可以声明和实现新的方法
• 在分类的方法中可以访问原有类的成员变量
• 【*】练习
• 给NSString类增加一个计算字符串中有多少数字的功能
• 给NSObject方法增加一个run方法
• 给NSObject扩展分类,应该非常谨慎,因为他会作用到所的类上面
• 【*】注意点
• 分类只能扩充功能不能扩充属性
• 在分类使用@property 只能生成方法的声明,不能生成方法的实现,更不能生成成员变量
• 分类中不能有与原来类同名的方法,不同分类中也不能有同名的方法
• 【*】如果分类中如果存在与原来类中的同名函数,那么分类中的方法会覆盖原有类中的方法(哪怕你没有导入这个分类)
• 【*】如果多个分类中有相同的方法,最后将使用最后编译的那个分类中的方法
• 【3】类扩展
• 用在.m文件中,给类增加私有的成员变量和方法
• 类扩展中小括号中没有内容
• 【4】SEL
• 概念【*】
• 它是一种代表着方法的签名数据类型,我们也成为它使一个选择器
• 使用
• 【*】定义普通的变量
• 【*】作为方法实参
• 与NSObject 相关方法配合使用
• 【*】判断一个对象是否实现了某个方法
• respondsToSelector:(SEL)
• [*]执行对象上某个的方法
• performSelector:(SEL)
• performSelector:(SEL)withObject:(id)
• performSelector:(SEL)withObject:(id) withObject:(id)
• 【*】延迟执行某个对象上的方法
• performSelector:(SEL) withObject:(id)afterDelay:(NSTimeInterval)]
• [*] 方法形参
• makeObject:(id)performSelector:(SEL)
• 【*】作为方法的返回值
• 【*】OC中的方法调用过程
• 【5】block
• 【*】作用:封装代码
• 【*】优点:消除了函数不能能定义在方法内部的缺点,使用起来更加灵活
• 【*】使用
• 【*】定义变量
• 返回值类型 (^变量名称) (形参列表)
• 【*】定义功能
• ^返回值类型 (形参列表)
• 无参无返回值
• ^{ 语句... };
• 有参无返回值
• ^(参数列表){语句...}
• 有参有返回值
• ^(参数列表){语句...}
• 【*】作为函数参数
• 返回值类型(^)(形参列表)
• 技巧:参数列表中写上参数的名称,方便以后使用
• 【*】typedef来定义类型
• typedef 返回值类型 (^block类型名称) (形参列表)
• 【*】使用场景
• 程序员的一天
• 当一个方法中前面一部分是确定的后面一部分也是确定的,只有中间一部分经常变化,那么中间的这部分就可以提取成为一个block
• 【*】注意点
• block内部不可以改变局部变量的值
• 若想改变局部变量值,就需要使用__block 来修饰这个变量
• 【6】协议
• 【*】概念:两个或两个以上对象之间约定
• 【*】定义
• @protocol 协议名称 <NSObject>
•
• //声明方法
•
• @end
• 中间只写方法声明
• 需要遵守协议NSObject
• 以@protocol 开头以 @end 结尾
• 一个协议也可以遵守多个协议
• @protocol 协议名称 <协议1,协议2,协议3 ...>
•
• //声明方法
•
• @end
• 【*】协议的基本使用
• 第一步:定义协议
• 第二步:遵守协议
• 在声明类的时候,在类名后面的通过<协议名称>来遵守协议
• @interface 类名 : 父类名称 <协议>
•
• @end
• 在类扩展中遵守协议
• @interface 类名() <协议>
•
• @end
• 第三步:实现协议中的方法
• 【*】注意点
• 一个类可以遵守多个协议中间以逗号隔开
• @interface 类名 : 父类名称<协议1,协议2,协议3...>
•
• @end
• 【*】id类型与协议
• id<协议名称> 变量名称
• 通过这种方式定义出来的指针变量,只能指向遵循了该协议的对象
• 通过这方式定义出来的指针变量,可以指向遵循该协议的任意对象
• 【*】两个关键字
• @required
• 表示遵守该协议的类必须要实现的方法
• @optional
• 表示遵守协议的类可以选择实现的方法
• 【7】代理设计模式
• 使用场景
• 当A类对象发生了什么事,想通知B类对象的时候(让B类对象成为A类对象的代理)
• 当A类对象有些事情,自己无法处理,需要B类对象帮助它处理( 让B类对象成为A类对象的代理)
• 当B类对象想要监听A类对象中发生的事情的时候(让B类对象成为A类对象的代理)
• 实现步骤
• A类中定义协议
• 该协议名称为ADelegate,其中声明一些希望B类实现的方法
• A类中添加一个类型 id<ADelegate> delegate的属性
• A类中当发生了什么事的时候,调用delegate相应的方法
• 注意在调用这个方法之前首先要判断delegate是否确实实现了这个方法,只有delegate实现这个方法才能调用这个方法
• B类遵守ADelegate的协议
• @interface B() <ADelegate>
•
• @end
• B类中实现ADelegate协议中声明的方法
• 注意:这里实现的方法可以是某一个或某几个或是全部,取决B对象希望监听A对象的什么事件
• 将B类对象赋值给A类对象的delegate属性
• 使用场景
•