黑马程序猿_OC之block与protocol

1.block

block也是一种数据类型,用来封装一段代码。

定义一个block变量,示例:

void (^myblock)();

int(^sumblock)(int,int);

void(^lineBlock)(int);

给block变量赋值一段代码,如:

void (^myblock)() = ^

{

NSLog(@"---------");

};

int(^sumblock)(int,int) = ^(int a,int b)

return a+b;

};

void(^lineBlock)(int) = ^(int n)
{
 for(int i = 0;i<n;i++)
 {
  NSLog(@"~~~~~~~~");
}
};

利用block变量调用block内部的代码,示例:

myblock();

int c = sumblock(10,21);

lineBlock(5);


block内部可以访问外面的变量,默认情况下,block内部不能修改外面的局部变量,但是给局部变量加上_block关键字,这个局部变量就可以在block内部修改

typedef int(^MyBlock)(int,int); 利用typedef定义block类型,再利用MyBlock类型来定义block变量   MyBlock block;

2.protocol

protocol 是用来声明一大堆方法,而且在任何类中都可以使用,但是不能声明成员变量。使用protocol里面声明的方法要遵守protocol的协议:只要这个类遵守了某个协议,相当于拥有了这个协议中的所有方法声明,只要父类遵守了某个协议,相当于子类也遵守了。

@protocol MyProtocol   // 定义了一个名叫MyProtocol的协议
@required    // 要求实现,不实现就会发出警告,默认情况,protocol使用的两个关键字
- (void)test;
- (void)test2;

@optional   // 不要求实现
- (void)test3;
@end

遵守协议的写法:说明这个类遵守了MyProtocol协议,他及他的子类都拥有这个协议里面所有的方法声明

@interface Person:NSObject <MyProtocol>
@end


另外一个类也可以遵守两个、多个协议

@interface Person:NSObject <MyProtocol,MyProtocol2>
@end

协议还可以遵守协议,即协议还可以拥有其他协议里面的方法声明:

@protocol MyProtocol3 <MyProtocol,MyProtocol2>
@end

基类也遵守了基协议NSObject,所有的协议都要遵守基协议NSObject

@protocol MyProtocol <NSObject>
@end

在项目开发中,有时候会要求变量保存的对象必须是遵守了某个协议的,如何实现呢?在类名后面写上协议名即可,代表保存的对象必须遵守这个协议,如(Person是遵守MyProtocol协议的):

NSObject <MyProtocol> *obj = [[Person alloc] init];

id <MyProtocol> obj2 = [[Person alloc] init];

在property参数中的表现形式:赋值的对象必须遵守MyProtocol协议

@property (nonatomic,strong) id <MyProtocol> obj;


@property (nonatomic,strong) NSObject <MyProtocol> *obj;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值