OC语言-06-OC语言-block与protocol
一、block
1> 基本使用
- 相当于用来存放代码的代码块
- 效率高
- 若没有形参可以省略小括号
2> block与函数的相同点
- 可以保存代码
- 可以有返回值
- 可以有形参
- 调用方式一样
3> block对外部变量的访问
- 可以访问外部变量
- 默认情况下,不能在block内修改外部变量
- 用关键字__block修饰外部变量,就可以在block内修改它
4> 用typedef定义block类型与函数类型
定义block类型
① 格式:typedef int (^myBlock)(int, int);
② myBlock是新的block类型的名字
③ myBlock前的int是block的返回值类型
④ myBlock后的小括号是形参列表
函数类型
① 格式:typedef int (*fun)(int, int);
② fun是新的函数类型的名字
③ fun前的int是函数的返回值类型
④ fun后的小括号是函数的形参列表
5> 示例
/*
1.使用typedef定义分别一个block类型,一个指向函数的指针
2.分别定义一个求和函数,用函数指针指向它
3.用新的block类型定义一个求和的block
4.定义一个输出一条横下的block
5.分别用函数指针和block实现两个数的求和,中间输出一条横线
*/
#import <Foundation/Foundation.h>
//用typedef定义一个返回值类型为int,有两个int类型形参的block类型
typedef int (^myBlock)(int, int);
//用typedef定义一个返回值类型为int,有两个int类型形参的函数指针
typedef int (*sumP)(int, int);
//定义一个求和函数
int sum(int a, int b)
{
return a + b;
}
int main()
{
//使用新的block类型定义一个求和的block
myBlock sumBlock =^(int a, int b){
return a + b;
};
//定义一个输出横线的block
void (^lineBLock)() = ^{
NSLog(@"--------------");
};
//使函数指针指向求和函数
sumP p = sum;
//通过block输出两个函数的和
NSLog(@"%d", sumBlock(11, 12));
//通过block输出一条横线
lineBLock();
//通过函数指针输出两个数的和
NSLog(@"%d", sumBlock(11, 12));
return 0;
}
二、protocol
1> 基本使用
作用
① 声明一个方法列表,不能扩充成员变量
② 若一个类/协议遵守该协议,就会拥有该协议的方法列表
③ 可以使用@protocol 提前声明一个协议
定义
① 格式
@protocol MyProtocol < BaseProtocol >
方法列表
@end
1)MyProtocol指定协议的名称
2)BaseProtocol指定该协议遵守的协议,通常遵守的是基协议,
如:NSObject ② @required与@optional
1)@required:默认为该关键字,所定义的方法列表要求遵守该
协议的类在实现文件中必须实现,不实现会发出警告
2)@optional:所定义的方法列表不要求遵守该协议的类实现
2> 协议遵守
类遵守协议
① 格式
@interface Name:NSObject < MyProtocol >
@end
1)Name是类名,MyProtocol是协议名
2)Name类将拥有协议MyProtocol声明的所有方法
协议遵守协议
① 格式如协议的定义
1)MyProtocol协议将会拥有BaseProtocol协议中声明的所有方法
3> @property的参数
作用
① 限制成员变量只能接受遵守某种协议的对象
格式
① @property (nonautomic, retain) id< MyProtocol > obj
1)MyProtocol限定obj只能接收遵守MyProtocol协议的对象
2)在相互引用的两个类中,retain参数在另一端要使用assign
4> 协议与分类
协议
① 若为多个不相关的类扩充方法列表,通常使用协议
② 若父类遵守该协议,则子类也遵守该协议
③ 若一个协议只被一个类遵守,通常把该协议定义在该类中
④ 若一个协议被多个类遵守,通常把该协议定义在定义成单独的文件
分类
① 若为单个类或多个相互继承的类扩充方法列表,通常使用分类
② 若父类用有一个分类,则该类的子类也将拥有该分类
③ 分类通常定义在单独的文件中
5> 协议的应用
代理模式
① 组成
1)抽象角色:通过接口或抽象类声明真实角色实现的业务方法
2)代理角色:实现抽象角色,是真实角色的代理,通过真实角色
的业务逻辑方法来实现抽象方法,并可以附加自己的操作
3)真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,
供代理角色调用
② 实例
1)主人委托保姆照顾孩子
2)老板委托秘书购买机票
协议在代理模式中的应用
① 通常情况下真是角色要定义自己的代理必须实现的规则
② 协议用来来实现代理所要遵循的规则
③ 遵循真实角色协议的对象,都可以作为真是角色的代理
6> 示例(多文件)
/******main.m文件******/
#import <Foundation/Foundation.h>
#import "Parent.h"
#import "Children.h"
#import "Nanny.h"
int main()
{
@autoreleasepool {
//定义一个Parent对象
Parent *p = [[Parent alloc] init];
//定义一个Children对象
Children *c = [[Children alloc] init];
//定义一个Nanny对象
Nanny *n = [[Nanny alloc] init];
//将对象p的属性Children初始化为c
p.children = c;
//将对象p的属性nanny初始化为n
p.nanny = n;
//调用对象p的takeCareTheChildren方法
[p takeCareTheChildren];
}
return 0;
}
/******Parent.h文件******/
#import <Foundation/Foundation.h>
//
#import "LookAfterTheChildren.h"
//
#import "Children.h"
#import "Nanny.h"
@interface Parent : NSObject
//声明成员变量nanny,且限定其只能接收遵守LookAfterTheChildren协议的对象
@property (nonatomic, strong) id<LookAfterTheChildren> nanny;
//声明成员变量children
@property (nonatomic, strong) Children *children;
//定义方法,实现照顾children的功能
- (void)takeCareTheChildren;
@end
/******Parent.m文件******/
#import "Parent.h"
@implementation Parent
//
- (void)takeCareTheChildren
{
//委托代理nanny来完成照顾children的任务
[_nanny feedTheChildren];
[_nanny playWithTheChildren];
}
@end
/******Children.h文件******/
#import <Foundation/Foundation.h>
@interface Children : NSObject
@end
/******Children.m文件******/
#import "Children.h"
@implementation Children
@end
/******Nanny.h文件******/
#import <Foundation/Foundation.h>
//
#import "LookAfterTheChildren.h"
//要想成为Parent的代理,必须遵守LookAfterTheChildren协议
@interface Nanny : NSObject<LookAfterTheChildren>
@end
/******Nanny.m文件******/
#import "Nanny.h"
@implementation Nanny
//实现LookAfterTheChildren协议的方法,具备照顾children的能力
- (void)feedTheChildren
{
NSLog(@"喂孩子吃饭");
}
- (void)playWithTheChildren
{
NSLog(@"陪孩子玩耍");
}
@end
/******LookAfterTheChildren.h文件******/
#import <Foundation/Foundation.h>
//由Parent定义的协议,声明照顾children的方法列表
@protocol LookAfterTheChildren <NSObject>
//给children喂饭的方法
- (void)feedTheChildren;
//陪children玩耍的方法
- (void)playWithTheChildren;
@end
OC语言-06-OC语言-block与protocol的更多相关文章
- oc是一个全动态语言,oc的一切都是基于runtime实现的!
oc是一个全动态语言,oc的一切都是基于runtime实现的! 从以下三方面来理解runtime吧! 1. 传统的面向过程的语言开发,例如c语言.实现c语言编译器很简单,只要按照语法规则实现一个LAL ...
- OC学习2——C语言特性之函数
1.OC是在C语言的基础上进行扩展的,在OC中直接用C语言进行coding也是可以通过编译的.因此,函数定义的语法格式如下: 函数返回值类型 函数名(形参列表) { //由零条或多条可执行性语句组成的 ...
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包
本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类 1.2 如何在swift中实现oc的代理 ...
- 06. Go 语言结构体
Go语言结构体(struct) Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型.Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. Go 语言中的类 ...
- [06 Go语言基础-包]
[06 Go语言基础-包] 包 什么是包,为什么使用包? 到目前为止,我们看到的 Go 程序都只有一个文件,文件里包含一个 main 函数和几个其他的函数.在实际中,这种把所有源代码编写在一个文件的方 ...
- OC语法1——OC概述
Object-C简介: OC,即Object-C,iOS开发的核心语言.它是基于C语言的,在C的基础上做了面向对象的封装,所以OC是面向对象的语言.同时也因此OC是兼容C的,也就是说在iOS开发中,可 ...
- 【C语言】01-C语言概述
说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语言.iOS开发不感兴趣,请忽略 为什么iOS开发要先学C语 ...
- 【C语言】C语言简介
目录: 1. [什么是C语言?] 2. [C语言历史] 3. [C语言标准] 4. [C语言特点] 1. 什么事C语言? · C语言是一门高级编程语言,用于人与计算机之间的沟通,就如同人与人之间沟通时 ...
- Hybrid App是如何实现网页语言与程序语言的混合?谁占主体?
[编者按]本文作者@徐珂铭,一位看好Html5的移动互联网的从业人士.喜爱玩技术,会点JAVA.HTML及CSS,有自己的想法及姑且能表达想法的文字,因此有了自己的文章. 基于HTML5的Web Ap ...
- 初识GO语言——安装Go语言
本文包括:1)安装Go语言.2)运行第一个Go语言.3)增加vim中对Go语言的高亮支持. 1.安装Go语言 本文采用源码安装Go语言,Go语言的源代码在百度网盘 http://pan.baidu.c ...
随机推荐
- AVL树(二)之 C++的实现
概要 上一章通过C语言实现了AVL树,本章将介绍AVL树的C++版本,算法与C语言版本的一样. 目录 1. AVL树的介绍2. AVL树的C++实现3. AVL树的C++测试程序 转载请注明出处:ht ...
- 警惕SQL语句陷井
以下SQL段,大家认为结果是什么呢? DECLARE @A VARCHAR(50) SET @A='Zuowenjun.cn' SELECT TOP 1 @A=ISNULL(FIELDNAME,'DE ...
- 【第三课】ANR和OOM——贪快和贪多的后果(上)
恼人的ANR 早先年用Android的时候,就连很多知名的app也总是莫名其妙崩溃,好像手机快的时候会崩溃,手机卡的时候app会卡死.卡死的时候会弹出来一个框,询问是要结束app还是继续等待.这就是A ...
- .NET 配置文件简单使用
当我们开发系统的时候要把一部分设置提取到外部的时候,那么就要用到.NET的配置文件了.比如我的框架中使用哪个IOC容器需要可以灵活的选择,那我就需要把IOC容器的设置提取到配置文件中去配置.实现有几种 ...
- ADO.NET学习系列(三)----做一个登录案例
总体思路.根据用户输入的用户名和密码,来判断,和数据库里面存的是不是一样,如果一样就表明登录成功,否则就登录失败. 方案一: 1.select* from 表名 where username=&quo ...
- 【iOS】利用Runtime特性做监控
最近在看Object-C运行时特性,其中有一个特别好用的特性叫 Method Swizzling ,可以动态交换函数地址,在应用程序加载的时候,通过运行时特性互换两个函数的地址,不改变原有代码而改变原 ...
- 世界上不存在什么RedBSD,SuseBSD或者ArchBSD,Turb...
世界上不存在什么RedBSD,SuseBSD或者ArchBSD,TurboBSD之类的东西.
- STL---Codeforces675D Tree Construction(二叉树节点的父亲节点)
Description During the programming classes Vasya was assigned a difficult problem. However, he doesn ...
- 快速设置超炫banner,js插件
http://www.themepunch.com/codecanyon/revolution_wp/ 记录一下以后用 //出自http://www.cnblogs.com/ahjesus 尊重作者辛 ...
- dbcp/c3p0连接池设置mysql会话变量
我们有几个计算风控值的定时任务,几乎每隔5秒会更新所有账户的当前总资产并以此通知风控,每隔一小时就产生一两个G的binlog,几十台服务器折腾..数据库是公用的,代码是通过工具自动生成的,直接修改流程 ...