------- android培训、.Net培训、IOS培训、碧空海的技术博客,期待与您交流!----------
第六讲 BLOCK
A.block的使用
1.Block用于封装(保存)一段代码,可以在任何时候执行。
2.Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
//声明
@interface Person :NSObject
@end
//实现
@implemention Person
@end
//主函数
Int main()
{
//block保存的代码: 书写规范; void (^函数名) () = ^{ }
//block标志:^
//定义block变量
Void (^myblock)() = ^{
NSLog(@”da yin”);
}
//利用block变量调用block内部代码
Myblock();
Return 0;
}
3.有返回值和形参的block函数
//block举例
Int (^sumblock)(int, int) = ^(int a, int b) {
Return a + b;
}
Void (^lineblock)(int)= ^(int n)
{
For (int I = 0; I < n; i++)
{
NSLog(@”-------------------”);
}
}
//调用的时候
Int c = sumblock(10, 12);
4. 03-block使用typedef定义block类型
//加法运算
Int (^sumBlock)(int, int);
sumBlock = ^(int a, int b) {
return a + b;
}
//减法运算
Int (^minusBlock)(int, int) = ^(int a, intb) {
return a – b;
}
//Block调用
NSLog(@”%d------%d”, MinusBlock(10, 8),sumBlock(12, 15));
//和Block相似的指针函数
Int (*p)(int, int);
Typedef int (*sum)(int, int);
Typedef int (^myBlock)(int, int);
5.使用Block注意点
a.如何定义block的变量
int (^sumBlock)(int,int); //又返回值,有参数
void (^myBlock)(); //无返回值,无参数
b.如何利用block封装代码
^(int a, int b) { return a – b; };
^(int a, int b) { return a + b; };
^() {
NSLog(@”----------”);
};
^ {
NSLog(@”----------”);
};
c.block访问外部变量
*block内部可以访问外面的变量
*默认情况下,block内部不能修改外面的变量
*给局部变量加上_block关键字,这个局部变量可以在block内部修改
d.利用typedef定义block类型
typedef int (^MyBlock)(int, int);
//以后就可以用MyBlock这种类型来定义block变量。
MyBlock sum, min;
MyBlock b3 = ^(int a, int b) { return a –b; };
B.protocol使用
1.可以用来声明一大堆方法(不能声明成员变量)
2.只要某个类遵循了这个协议,就相当于拥有了这个协议中的所有方法声明。
3.只要父类遵循了这个协议,就相当于子类也遵守了这个协议。
4.协议格式
//新建文件时选择protocol
//定义了一个名叫protocol的协议,声明需要的方法。<NSObject>这是遵守对应的协议
@protocol MyProtocol <NSObject>
//@required 要求实现,不实现就会发出报警
//@optional 不要求实现
@required
-(void)text;
-(int)text1;
@end
//声明,Person遵守了MyProtocol了,就是遵守了Protocol协议了,那么Person中就用了协议中的方法声明了。
@interface Person :NSObject<MyProtocol>
@end
5.一个类可以遵守多个协议
//声明,Person遵守了MyProtocol了,就是遵守了Protocol协议了,那么Person中就可以用协议中的方法声明了。
@interface Person :NSObject <MyProtocol, MyProtocol2>
@end
6.基协议
*NSObject是一个基类,最根本最基本的类,任何其他类的最终都要继承它
*还有一个协议,名字叫NSObject,他是一个基协议,最根本最基本的协议
*NSObject协议声明很多最基本的方法,比如retain、release、description等
*建议每个新的协议都要遵守NSObject协议。
//一个协议遵守了谋一份协议,就可以拥有另外一个协议的所有方法声明
7.协议限制对象类型
a.要求obj保存的对象必须遵守MyProtocol这个协议
int main()
{
NSObject *obj = [[NSObject alloc] init];
NSObject *obj2 = @”456753159”;
//要求obj3保存的对象必须遵守MyProtocol这个协议
//在不使用对象的时候,会出现警告。
NSObject<MyProtocol> *obj3 =[[NSObject alloc] init]; //右边没有遵守协议,这样写会警告
NSObject<MyProtocol> *obj4 = [[Personalloc] init]; //Person遵守了协议,这样写是成立的。
//要求obj5,保存的对象必须遵守MyProtocol3协议,并且继承Person
Person<MyProtocol> *obj5 = [[Personalloc] init];
Obj5 = nil;
Return 0;
}
//用来替代#import包含头文件Hashiqi、MyProtocol
@class Hashiqi;
@protocol MyProtocol2;
//在声明中
//声明了obj变量,为id类型,并且遵守了MyProtocol协议
@property (nonatomic, strong)id<MyProtocol> obj;
@property (nonatomic, strong) Hashiqi *dog;
8.Protocol协议总结
//协议的定义
//如何遵守协议
//协议中方法声明的关键字
//定义一个变量的时候限制变量遵守某个协议
//@proterty中声明的属性也是可用作一个遵守协议的限制
//协议的其他应用总结
9.代理设计模式(协议的应用
a.一个人让另外一个人去买票
//Person类
//声明
@interface Person : NSObject
//拥有一个代理属性
@property (nonatomic, retain) Agent*delegat
-(void)buyTicket;
@end
//实现
@Implemention Person
-(void) buyTicket
{
//叫代理去帮自己买票(询问票价,剩余多少票)
}
-(void)dealloc
{
[_delegat release];
[super dealloc];
}
@end
//Agent(代理)类
//声明
@interface Agent: NSObject
@end
//实现
@Implemention Agent
@end
//主函数
Int main()
{
//人对象
Person *p = [[person alloc] init];
//代理买票对象
Agent *a = [[Agent alloc] init];
//人打算买电影票
[p buyTicket];
[p release];
[a release];
Return 0;
}