本分享是面向有意向从事iOS开发的伙伴及苹果产品的发烧友,亦或是已经从事了iOS的开发者,想进一步提升者。如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步。如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective
C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!
一、category 分类
在C++中有强大的多重继承,而在oc中方法都是单继承的,为了模块化开发,便于团队开发,oc中有其他语言所没有的category(分类,类目,类别)和class
Exetension(类扩展)等语法,可以在不修改原来类的基础上, 为这个类扩充一些方法.
Category的格式
1.在.h文件中声明类别
(1)新添加的方法必须写在 @interface 与 @end之间
(2)ClassName 现有类的类名(要为哪个类扩展方法) +
(3)CategoryName 待声明的类别名称
(4)NewMethod 新添加的方法
@interface ClassName (CategoryName) NewMethod; //在类别中添加方法 //不允许在类别中添加变量 @end |
注意:
不允许在声明类别的时候定义变量
在.m文件中实现类别:
(1)新方法的实现必须写在@ implementation与@end之间
(2)ClassName 现有类的类名
(3)CategoryName 待声明的类别名称
(4)NewMethod 新添加的方法的实现
category使用注意:
1. 分类只能增加方法, 不能增加成员变量
2. 分类中写property只会生成方法声明
3. 分类可以访问原来类中的成员变量
4. 如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略
分类的编译的顺序
方法调用顺序(从高到低) 分类 –>原来类 –>父类
分类应用场景:开发中经常使用的方法,可以抽出一个分类,团队开发中,多人共同开发,可以写多个分类,最后进行融合。
二、Exetention 匿名扩展
1.匿名扩展定义
延展类别又称为扩展(Extendsion),Extension是Category的一个特例
可以为某个类扩充一些私有的成员变量和方法写在.m文件中
英文名是Class Extension
2.扩展书写格式
在.m文件中
@interface 类名 () { int _age; } - (void)say;
@end |
三、Block
1.Block简介
Block是iOS中一种比较特殊的数据类型
Block是苹果官方特别推荐使用的数据类型, 应用场景比较广泛。
Block应用场景:
动画
多线程
集合遍历
网络请求回调
2.Block的作用
用来保存某一段代码, 可以在恰当的时间再取出来调用
功能有点类似于函数和方法。
3.Block的定义格式:
返回值类型 (^block变量名)(形参列表) = ^(形参列表) {
};
(1)无返回值,无形参
void(^Myblock)() = ^{ NSLog(@”Hello”); }; |
(2)有返回值,有形参
int(^MyBlock)(int,int) = ^(int a,int b){ return a +b; }; |
(3)无返回值,有形参
void(^MyBlock)(int) = ^(int num){ for (int i = 0,i |
三、Protocol 协议
1.protocol 基本概念
Protocol翻译过来, 叫做”协议”
(1)在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现的
protocol它可以声明一些必须实现的方法和选择实现 的方法。这个和java是完全不同的。
2.Protocol的作用:
用来声明一些方法,也就说, 一个Protocol是由一系列的方法声明组成的。
3.protocol 语法格式
(1)Protocol的定义
@protocol 协议名称 // 方法声明列表 @end |
(2)类遵守协议
一个类可以遵守1个或多个协议
任何类只要遵守了Protocol,就相当于拥有了Protocol的所有方法声明.
4.protocol和继承区别
继承之后默认就有实现, 而protocol只有声明没有实现
相同类型的类可以使用继承, 但是不同类型的类只能使用protocol
protocol可以用于存储方法的声明, 可以将多个类中共同的方法抽取出来,
以后让这些类遵守协议即可。
5.协议中的两个关键字
有2个关键字可以控制方法是否要实现(默认是@required,在大多数情况下,用途在于程序员之间的交流)
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional:这个方法不一定要实现
6.协议的局限性
协议是用来声明一大堆的方法,不能声明成员变量,也不能写实现方法,而某个类遵守了这个协议就可以进行协议中声明的方法的实现,这样虽然能解决OC的单继承问题,但是有类型的限制,不能够更好的做到程序的扩展性,那么在协议的基础上通过什么能够更具扩展性呢?答案是——
代理。
7.协议的注意事项
(1)协议只能声明方法, 不能声明属性
(2)父类遵守了某个协议, 那么子类也会自动遵守这个协议
(3)在OC中一个类可以遵守1个或多个协议
注意: OC中的类只能有一个父类, 也就是说OC只有单继承
(4)OC中的协议又可以遵守其它协议, 只要一个协议遵守了其它协议, 那么这个协议中就会自动包含其它协议的声明。
8.协议的应用场景及注意点
(1)做类型限定
类型限定就是限定一个类必须遵守某个协议
数据类型<协议名称> 变量名
@proterty(nonatomic , strong)dog< DogRunning > *dog; |
(2)类型限定的注意点
1.类型限定是写在数据类型的右边的
2.虽然在接受某一个对象的时候, 对这个对象进行了类型限定(限定它必须实现某个协议),
3但是并不意味着这个对象就真正的实现了该方法. 所以每次在调用对象的协议方法时应该进行一次验证
if([self.dag respondsToSelect:@selector(run)]){ [self.dog run]; } |
四、委托代理
1.什么是设计模式?
在计算机编程语言中有32种设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样,在iOS中常用的实际模式为:代理方法,MVC模式,MVVC模式,单例模式等。
2.代理设计模式
代理模式是iOS开发中非常重要的一种设计模式,在UI中用的最多,有以下两种情况:
(1)当对象A发生了一些行为,想告知对象B(让对象B成为对象A的代理对象)对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
(2)当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)
3.代理编写规范
(1)一般代理属于谁,就写在谁的头文件中定义。
(2)协议的名称一般以他得属性的那个类的类名开头,后面跟上Protocol或者Delegate。
(3)协议中的方法名称一般以协议的名称Protocol之前的作为开头。
4.接受遵守协议的代理对象关键字
id关键字接受遵守协议的代理
@property(nonatomic,weak)id< DogDelegate>dog; |
5.实现代理的步骤
发出代理者:
(1)声明一个类: @class 类名
(2)定义代理协议
(3)将代理作为属性,类型限定代理遵守协议
(4)声明方法,方法里调用代理,调用代理实现的协议方法
接受代理者
(5)带入代理
(6)遵守代理
(7)实现协议中的方法
发出的代理者
(8)实现调用代理者的方法
判断代理是否实现了协议中的方法
如果代理实现了代理中的方法,就调用
if ([self.delegate respondsToSelector:@selector(eat:)]) { [self.delegate eat:self]; } |
@class与#import的区别,两个点:
(1)作用上得区别:
·#import会包含引用类的所有信息(内容),包括引用类的变量和方法
.@class仅仅告诉编译器有这么一个类,具体这个类有什么信息,完不知
(2 )效率上得区别.
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的文件有改动,后面引用到这个文件的所有类都需要重新编译一变,效率非常低。
|