黑马程序员——Objective-C——block和protocol

来源:互联网 发布:怎么骗取淘宝运费险 编辑:程序博客网 时间:2024/06/05 06:49

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———


一、block

苹果官方建议尽量多用block。在多线程、异步任务、集合遍历、集合排序、动画转场用的很多

1.作用

1>block封装了一段代码,可以在任何时候执行

2>block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。

2.block的定义

int (^sumBlock) (int ,int) = ^(int a,int b){  // 注意前面的两个括号以及^的位置return a+b;  // int型需要有返回值,返回值类型也为int}// block的调用int sum = sumBlock (3,4);  // 调用时不需要用^// 错误写法:int a = 3;int (^myBlock)(int ) = (int num ){a ++;  //  block不可以改变局部变量的值,只可以访问return num + a;}// 如果想要修改,a定义时需要这样写:__block int a = 3;  // block是两条下划线

3.使用typedef定义block

typedef int (^myBlock)(int ,int);  // 和指针函数类似,myBlock即为定义的新名// 调用blockmyBlock sumBlock = ^(int a,int b){  // 求和return a+b;}myBlock minusBlock = ^(int a,int b){  // 求差return a-b;}

4. block的应用

// 使用一个block返回和、差int (^myBlock)(int ,int,int *) = ^(int a,int b,int *p){*p = a-b;  // 利用指针求出差return a+b;  // 返回和}int sum,minus;  // 定义和、差得变量,用于接收结果sum = myBlock(4,5,&minus);  // 传入minus的地址NSLog(@”sum = %d, minus = %d”,sum,minus);  // 打印结果为sum = 9,minus = -1

二、protocol(协议)

1.作用

1> 用来声明一大堆方法(没有.m),但是不能定义成员变量

2> 只要某个类遵守了协议,就拥有协议的所有方法

3> 父类遵守了协议,子类也自动遵守

2.基本格式

// 编写一个协议@protocol 协议名 <NSObject>// 方法声明@end// 类中协议的遵守@interface 类名 :父类名 <协议名>@end// 协议遵守协议@protocol 协议名 <遵守协议名1,遵守协议名2>// 方法声明@end// 定义变量时遵守某个协议id<协议名> obj;Person <协议名> *person;// property定义属性时的使用@protocol (nonatomic, strong) id <协议名> obj;@protocol (nonatomic, strong) Person<协议名> *person;

3.协议中的关键字

@required:说明该方法需要实现(但是不实现也不会报错,只是警告)

@optional: 可以不实现

关键字多用于程序员之间的交流

4.代理模式的代码练习

// 情景简述:经理有一份差事,自己不想去做,找别人去做>。// 下面为主要代码// 协议protocol@protocol MyProtocol <NSObject>- (void)doSth;@end// Boss类#import “MyProtocol.h”@interface Boss : NSObject <MyProtocol>  // 类遵守协议@property id<Myprotocol> delegate; // 定义一个代理属性,遵守协议- (void)result; // 定义自己的方法@end@implementation Boss- (void)result{[delegate doSth]; // 调用代理的方法NSLog(@”通过代理的帮忙,完成了该任务”);}@end// 做事的人@interface Worker : NSObject <MyProtocol>@end@implementation- (void)doSth  // 协议方法的实现{NSLog(@”工人完成了任务”);}@end// main.m中// 分别创建老板和工人对象Boss *b = [[Boss alloc] init];Worker *w = [[Worker alloc] init];// 工人对象作为老板的代理属性b.delegate = w;// 老板调用自己方法[ b result];






0 0
原创粉丝点击