------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员-iOS基础-Objective-C基础(七)block和protocol
一、block
block是一种数据类型,苹果官方推荐使用,效率高
block用来保存一段代码,标志是^
block跟函数很像
1.可以保存代码
2.有返回值
3.有形参
如何定义Block变量
int (^sumblock)(int, int)
void (^myblock1)()
如何利用Block封装代码
^(int a, int b){
return a + b
};
^{
NSLog(@"---------");
NSLog(@"---------");
};
block访问外部变量
block内部可以访问外面的变量
默认情况下,block内部不能修改外面的局部变量
给局部变量加上__block关键字,这个局部变量就可以在block内部修改
利用typedef定义block类型
typedef int (^MyBlock)(int, int);
//以后可以利用MyBlock类型类定义Block变量
MyBlock b1, b2;
b1 = ^{
NSLog(@"---------");
NSLog(@"---------");
};
MyBlock b3 = ^(int a, int b){
return a + b
};
练习:
// 无参无返回值block
void test()
{
// 定义block变量,如果没有形参,可以省略等号右侧空的括号
void (^myblock1)() = ^(){
NSLog(@"---------");
NSLog(@"---------");
};
// 利用block变量调用block内部的代码
myblock1();
}
// 有参有返回值block
void test2()
{
int (^sumblock)(int, int) = ^(int a, int b){
return a + b
};
sumblock(10, 20);
// 用一个block输出n条横线
void (^printLineBlock)(int) = ^(int n){
for(int i = 0; i < n ; i++)
{
NSLog(@"----------");
}
};
printLineBlock(5);
}
二、protocol协议
2.1 基本用途
用来声明一大堆方法(不能声明成员变量)
只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
只要父类遵守了某个协议,就相当于子类也遵守了
2.2 格式
协议的编写
@protocol 协议名称
// 方法声明列表
@end
某个类遵守协议
@interface 类名 : 父类 <协议名称1, 协议名称2>
@end
:继承
<>遵守协议
协议遵守协议
@protocol 协议名称 <协议1, 协议2>
@end
一个协议可以遵守其他多个协议,多个协议之间用逗号 , 隔开
一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明
2.3 关键字
@required:这个方法必须要实现(若不实现,编译器会发出警告)
@optional:这个方法不一定要实现
2.4 基协议
NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
NSObject协议中声明很多最基本的方法,比如description、retain、release等
建议每个新的协议都要遵守NSObject协议
2.5 定义变量时指定协议
// NSObject类型的对象,并且要遵守NSCopying协议
NSObject<NSCopying> *obj;
// 任何OC对象,并且要遵守NSCoding协议
id<NSCoding> obj2;
// 要求obj5,保存的对象必须遵守MyProtocol3,并且继承了Person
Person<MyProtocol3> *obj5;
// 如果没有遵守对应的协议,编译器会警告(严重,必须修复)
2.6 声明类和协议时都用@class和@protocol,使用时再#import
2.7 @property声明属性也可以进行协议限制
@property (nonatomic, strong) 类名<协议名> *属性名;
2.8 协议可以定义在单独的.h文件中,也可以定义在某个类中
如果协议只用在某个类中,应该把协议定义在该类中
如果协议用在多个类中,则应该把协议单独定义在一个.h文件中
三、代理设计模式
3.1 设计原理
有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
3.2 设计原则
首先得拥有某个代理对象属性
其次要很清楚代理有哪些方法
最后要保证能解耦
3.3 实现方案
定义一个protocol,在其中声明一些和代理沟通的方法
拥有一个代理属性id<protocol> delegate
让代理遵守protocol