您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Objective C语言—特有语法及设计模式
 
作者:极客James 来源:CSDN 发布于:2015-9-25
  3321  次浏览      15
 

本分享是面向有意向从事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,那么一旦最开始的文件有改动,后面引用到这个文件的所有类都需要重新编译一变,效率非常低。

   
3321 次浏览       15
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]
Visual C++编程命名规则
任何时候都适用的20个C++技巧
C语言进阶
串口驱动分析
轻轻松松从C一路走到C++
C++编程思想
更多...   


C++并发处理+单元测试
C++程序开发
C++高级编程
C/C++开发
C++设计模式
C/C++单元测试


北京 嵌入式C高质量编程
中国航空 嵌入式C高质量编程
华为 C++高级编程
北京 C++高级编程
丹佛斯 C++高级编程
北大方正 C语言单元测试
罗克韦尔 C++单元测试
更多...