———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 协议名 <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];