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

———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即为定义的新名
// 调用block
myBlock 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 协议名 
// 方法声明
@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 
- (void)doSth;
@end

// Boss类
#import “MyProtocol.h”
@interface Boss : NSObject   // 类遵守协议
@property id delegate; // 定义一个代理属性,遵守协议
- (void)result; // 定义自己的方法
@end
@implementation Boss
- (void)result
{
	[delegate doSth]; // 调用代理的方法
	NSLog(@”通过代理的帮忙,完成了该任务”);
}
@end

// 做事的人
@interface Worker : NSObject 
@end
@implementation
- (void)doSth  // 协议方法的实现
{
	NSLog(@”工人完成了任务”);
}
@end

// main.m中
// 分别创建老板和工人对象
Boss *b = [[Boss alloc] init];
Worker *w = [[Worker alloc] init];
// 工人对象作为老板的代理属性
b.delegate = w;
// 老板调用自己方法
[ b result];






你可能感兴趣的:(Objective-C)