OC语言的Block与Protocol(协议)
Block
● Block封装了一段代码,可以在任何时候执⾏行
● Block可以作为函数参数或者函数的返回值,⽽而其本⾝身又可以带输⼊入参数或返回值。
● 苹果官⽅方建议尽量多⽤用block。在多线程、异步任 务、集合遍历、集合排序、动画转场⽤用的很多
定义BLOCK变量
Int (^SumBlock)(int,int);//有参数,返回值类型为int
Void (^MyBlock)();//无参数,返回值类型为空
Blocks的定义:
int (^MySum)(int, int) = ^(int a, int b) {
return a+b;
};
定义了⼀一个叫MySum的blocks对象,它带有两个int参数,返回int。等式右边就 是blocks的具体实现
Block可以访问局部变量,但是不能修改。 int sum = 10;
int (^MyBlock)(int) = ^(int num) {
sum++;//编译报错
return num * sum;
};
如果要修改就要加关键字:__block __block int sum = 10;
int (*myFn)(); ● 定义Blocks
int (^MyBlocks)(int,int); ● 调⽤用函数指针
(*myFn)(10, 20);
● 调⽤用Blocks MyBlocks(10, 20);
Blocks的赋值
● 在声明的同时定义变量,然后赋值
int (^MySum)(int,int) = ^(int a,int b) {
return a + b;
};
● 也可先⽤用typedef先声明类型,再定义变量进⾏行赋值 typedef int (^MySum)(int,int);
MySum sum = ^(int a,int b) {
return a + b;
};
//
// main.m
// 04-block
//
// Created by apple on 13-8-11.
// Copyright (c) 2013年 itcast. All rights reserved.
// #import <Foundation/Foundation.h> /*
block要掌握的东西
1> 如何定义block变量
int (^sumBlock)(int, int);
void (^myBlock)(); 2> 如何利用block封装代码
^(int a, int b) {
return a - b;
}; ^() {
NSLog(@"----------");
}; ^ {
NSLog(@"----------");
}; 3> block访问外面变量
* block内部可以访问外面的变量
* 默认情况下,block内部不能修改外面的局部变量
* 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 4> 利用typedef定义block类型
typedef int (^MyBlock)(int, int);
// 以后就可以利用MyBlock这种类型来定义block变量
MyBlock block;
MyBlock b1, b2; b1 = ^(int a, int b) {
return a - b;
}; MyBlock b3 = ^(int a, int b) {
return a - b;
};
*/ typedef int (*SumP)(int, int); typedef int (^MyBlock)(int, int); int sum(int a, int b)
{
return a + b;
} int main()
{
// int (*p)(int, int) = sum;
// int (*p2)(int, int) = sum;
// SumP p = sum;
// SumP p2 = sum; /*
int (^sumBlock)(int, int); sumBlock = ^(int a, int b) {
return a + b;
}; int (^minusBlock)(int, int) = ^(int a, int b) {
return a - b;
};*/ MyBlock sumBlock;
sumBlock = ^(int a, int b) {
return a + b;
}; MyBlock minusBlock = ^(int a, int b) {
return a - b;
}; MyBlock multiplyBlock = ^(int a, int b) {
return a * b;
}; NSLog(@"%d - %d - %d", multiplyBlock(, ), sumBlock( , ), minusBlock(, )); return ;
} void test3()
{
int a = ;
__block int b = ; void (^block)(); block = ^{
// block内部可以访问外面的变量
//NSLog(@"a = %d", a); // 默认情况下,block内部不能修改外面的局部变量
// a = 20; // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
b = ;
}; block();
} // 有返回值、有形参的block
void test2()
{
/*
// 指针函数的指针
int (*p)(int, int) = sum;
int d = p(10, 12);
NSLog(@"%d", d);
*/ int (^sumblock)(int, int) = ^(int a, int b){
return a + b;
}; int c = sumblock(, ); // 用一个block输出n条横线 void (^lineBlock)(int) = ^(int n)
{
for (int i = ; i<n; i++) {
NSLog(@"----------------");
}
};
lineBlock(); } // 没有返回值、没有形参的block
void test()
{
// block用来保存一段代码
// block的标志:^
/*
block跟函数很像:
1.可以保存代码
2.有返回值
3.有形参
4.调用方式一样
*/ // 定义block变量
/*
void (^myblock)() = ^(){
NSLog(@"----------------");
NSLog(@"----------------");
};*/ // 如果block没有形参,可以省略后面的()
void (^myblock)() = ^{
NSLog(@"----------------");
NSLog(@"----------------");
}; // 利用block变量调用block内部的代码
myblock(); myblock();
}
Protocol(协议)
➢Protocol声明的方法可以让任何类去实现,protocol就是协议。
➢OC不能继承多个类(单继承)但是能够遵守多个协议。继承(:),遵守协议(< >)
➢基协议:<NSObject>是基协议,是最根本最基本的协议,其中声明了很多最基本的方法。
➢协议可以遵守协议,一个协议遵守了另一个协议,就可以拥有另一份协议中的方法声明。
@protocol 协议名称
// 方法声明列表
@end
@interface 类名 : 父类 <协议名称>
@end
协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,用途在于程序员之间的交流
@protocol 协议名称 <协议1, 协议2>
@end
// NSObject类型的对象,并且要遵守NSCopying协议
NSObject<NSCopying> *obj;
// 任何OC对象,并且要遵守NSCoding协议
id<NSCoding> obj2;
//
// main.m
// 05-protoco
//
// Created by apple on 13-8-11.
// Copyright (c) 2013年 itcast. All rights reserved.
// /*
1.协议的定义
@protocol 协议名称 <NSObject>
// 方法声明列表....
@end 2.如何遵守协议
1> 类遵守协议
@interface 类名 : 父类名 <协议名称1, 协议名称2> @end 2> 协议遵守协议
@protocol 协议名称 <其他协议名称1, 其他协议名称2> @end 3.协议中方法声明的关键字
1> @required (默认)
要求实现,如果没有实现,会发出警告 2> @optional
不要求实现,怎样不会有警告 4.定义一个变量的时候,限制这个变量保存的对象遵守某个协议
类名<协议名称> *变量名;
id<协议名称> 变量名;
NSObject<MyProtocol> *obj;
id<MyProtocol> obj2; 如果没有遵守对应的协议,编译器会警告 5.@property中声明的属性也可用做一个遵守协议的限制
@property (nonatomic, strong) 类名<协议名称> *属性名;
@property (nonatomic, strong) id<协议名称> 属性名; @property (nonatomic, strong) Dog<MyProtocol> *dog;
@property (nonatomic, strong) id<MyProtocol> dog2; 6.协议可用定义在单独.h文件中,也可用定义在某个类中
1> 如果这个协议只用在某个类中,应该把协议定义在该类中 2> 如果这个协议用在很多类中,就应该定义在单独文件中 7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中
1> 一般情况下,都是定义在单独文件
2> 定义在原来类中的分类,只要求能看懂语法
*/ #import <Foundation/Foundation.h>
#import "MyProtocol.h"
#import "MyProtocol3.h"
#import "Person.h"
#import "Dog.h"
#import "Hashiqi.h" int main()
{
Person *p = [[Person alloc] init];
p.obj = [[Hashiqi alloc] init]; return ;
} void test()
{
//NSObject *obj = [[NSObject alloc] init]; //NSObject *obj2 = @"4324324"; // 要求obj3保存的对象必须是遵守是MyProtocol这个协议 //NSObject<MyProtocol> *obj3 = [[NSObject alloc] init]; NSObject<MyProtocol> *obj3 = [[Person alloc] init]; obj3 = nil; id<MyProtocol> obj4 = [[Person alloc] init]; obj4 = nil; // 要求obj5,保存的对象必须遵守MyProtocol3、并且继承了Person
Person<MyProtocol3> *obj5 = [[Person alloc] init]; obj5 = nil;
}
代理设计模式
//
// main.m
// 07-协议的应用-代理模式
//
// Created by apple on 13-6-30.
// Copyright (c) 2013年 apple. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Person.h"
#import "Agent.h"
#import "NextAgent.h" int main(int argc, const char * argv[])
{ @autoreleasepool {
Person *p = [[[Person alloc] init] autorelease]; NextAgent *a = [[[NextAgent alloc] init] autorelease]; p.delegate = a; [p buyTicket];
}
return ;
} void test()
{
// 人
Person *p = [[Person alloc] init];
// 代理
Agent *a = [[Agent alloc] init]; // 设置人的代理
p.delegate = a; // 人打算看电影
[p buyTicket]; [a release];
[p release];
}
OC语言的Block与Protocol(协议)的更多相关文章
- OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似 ...
- 李洪强iOS开发之OC语言BLOCK和协议
OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么? 苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相 ...
- oc语言--BLOCK和协议
一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. BOLCK和函数的相似性:(1)可以保存代码(2 ...
- oc语言--protocol(协议)
一.protocol 1.基本用途 1> 可以用来声明很多方法,但是不能用来声明成员变量 2> 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3> 只要父类遵守了某 ...
- 「OC」block 和 protocol
一.block (一)简介 block 是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,block 可以在任何时候执行.在多线程.异步任务.集合遍历.集合排序.动 ...
- OC语言-block and delegate
参考博客 OC语言BLOCK和协议 iOS Block iOS Block循环引用精讲 iOS之轻松上手block 深入浅出Block的方方面面 Block apple官方参考 1.定义一个block ...
- OC语法10——@protocol协议,
参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...
- OC语言Block 续
OC语言 Block 转载:http://blog.csdn.net/weidfyr/article/details/48138167 1.Block对象中的变量行为 结论: 在block代码块内部可 ...
- OC语言Block
OC语言Block 一.Block (一)简介 Block是什么?苹果推荐的比较特殊的数据类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任何时候执行. Block和 ...
随机推荐
- ST40 自制 JTAG 适配器
// 文章首发于 https://zhuanlan.zhihu.com/p/28762429 // 但是不知道为什么搜索引擎还没有收录,便在博客再次发布. 0. 引言 意法半导体生产的 SH4 架构的 ...
- C#使用互斥量(Mutex)实现多进程并发操作时进程间的同步操作(进程同步)
本文主要是实现操作系统级别的进程同步的代码及测试结果,代码经过测试,可直接使用,也可供参考. 承接上一篇博客的业务场景[C#使用读写锁三行代码简单解决多线程并发写入文件时线程同步的问题]. 随着服务进 ...
- ueditor编辑器插件 chrome中图片上传框延时问题
最近在项目中使用ueditor插件进行文字的在线编辑功能时,发现这个插件的图片上传弹框在chrome浏览器延迟非常的厉害.经过多方搜索,终于解决.现将解决方案记录如下: 1.修改/Ueditor/di ...
- 一次从0到1的java项目实践清单
虽说工作就是简单的事情重复做,但不是所有简单的事你都能有机会做的. 我们平日工作里,大部分时候都是在做修修补补的工作,而这也是非常重要的.做好修补工作,做好优化工作,足够让你升职加薪! 但是如果有机会 ...
- CMake vs Make对比
程序员现在已经使用了CMake和Make了很久.当您加入大公司或开始使用大型代码库开发项目时,您需要处理所有这些构建.你必须看到这些“CMakeLists.txt”文件浮动.你应该在终端上运行“cma ...
- 初识Http协议抓包工具—Fiddler
1.Fiddler简介 Fiddler是用一款使用C#编写的http协议调试代理工具.它支持众多的http调试任务,能够记录并检查所有你的电脑和互联网之间的http通讯,可以设置断点,查看所有的“进出 ...
- idea中的汉语注释出现乱码的解决方案
日记 - idea中的汉语注释出现乱码的解决方案 我是个idea的忠实用户,新公司的项目都是用eclipse做的,通过svn拉下代码后发现,注释的内容里,中文内容都是乱码.问过项目负责人,说可能是GB ...
- 读书笔记-你不知道的JS上-混入与原型
继承 mixin混合继承 function mixin(obj1, obj2) { for (var key in obj2) { //重复不复制 if (!(key in obj1)) { obj1 ...
- where id in用 order by field 保持排序
转载自http://blog.linuxphp.org/archives/1588/ 先看下mysql的默认排序 select id from article where id in(63261,63 ...
- vue-修改vue项目运行端口号
一.导语 最近在研究,左侧是导航,右侧是显示对应的内容,左右可单独滚动,不互相影响,如何实现? 萝卜蹲的游戏大家都玩过,白萝卜蹲,白萝卜蹲,白萝卜蹲完红萝卜蹲,可是若是在含有滚动条的页面的情况下,白萝 ...