一、Block代码块
代码块的本质与其他变量类似,但是代码块存储的是一个函数体。
首先我们要知道block代码块的语法标记:脱字符(^)
1.Block代码块的写法与C语言中指向函数的指针很相似
1>Block示例:
运行结果:
2>指向函数的指针示例
运行结果:
2.block的一些情况:
1>没有参数和返回值时:
void (^myblock)=^{ /*函数体*/ };
2>有返回值和多个参数时:(一个参数上面的例子已经讲了)
void (^myblock)(int,int)=^(int num1,int num2){ /*函数体*/ };
是不是很像指向函数的指针~
3>代码块中的全局变量和局部变量:
①全局变量
可以看到在block可以使用和改变全局变量
②局部变量
在第一个例子中我们看到局部变量a是可以使用的,但是我试着在block中改变一下a的值,运行:
可以看到报错了,所以在block中局部变量可以使用,但不可以改变它的值
但是如何解决这个问题呢?只需要在局部变量前加上关键字__block:
运行结果:
4>block代码块的递归调用
运行结果:
注意:代码块变量必须是静态变量或者全局变量
后面讲到集合的时候,还要谈到利用block代码块遍历集合,这里就不多说了。
二、protocol(协议)
1.协议的概念:
1>协议声明了可以被任何类实现的方法
2>协议不是类,它定义了一个其他对象可以实现的接口
3>如果在某个类中实现了协议的某个方法,也就代表这个类实现了那个协议
4>协议经常用来委托对象,一个委托对象是一种用来协同或者代表其他对象的特殊对象
5>委托,就是调用自己定义方法,别的类来实现
2.这里介绍两个关键字
1>@optional 可以选择实现的方法
2>@required 必须强制实现的方法
注意:虽然协议中声明的方法默认是要强制实现的,但是开发中我们最好不要省略@required,便于合作的人理解
3.完整的创建一个协议
1>创建一个命令行项目,new file
2>选择OS X下Source中的Objective-C File
3>在File Type里选择protocol ,并取好名字,选择好要继承的类,这里我没有创建类所以继承NSObject
4>完成
5>示例:
①MyProtocol.h
注意:@optional下的方法可以实现也可以不实现,@required下的方法必须实现,否则会报错
②Number.h
注意:导入协议时,首先要在类的.h文件中improt协议的文件(其实最好的方法是跟@class类似,利用@protocol关键字,告诉编译器这是一个协议),之后在父类旁边添加<协议名>
③Number.m
注意:。。好像没什么要注意的
④main.m
注意:。。好像还是没什么要注意的
⑤运行结果