黑马程序员--Objective-C——Block与@protocol

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Block


1.Block简介

Block是一种数据类型,封装了一段代码,可以在任何时候执行。Block可以在程序运行时保存一段代码(函数不行)。Block跟函数一样,有返回值,形参。

 

2.Block使用方法

Block

以“^{ 要保存的代码块 }”表示一段Block

Block变量:

以“返回值类型 (^Block名称)(形参类型)”表示一个Block类型的变量。和以前学过的C语言的指向函数的指针很像。如果没有形参,则(形参类型)可以省略。

Block变量调用Block里面的内容:

Block名称();

 

没有返回值和形参的Block

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[])
{
    void (^myBlock)() = ^{
        NSLog(@"要保存的代码块!");
    };
    myBlock();
    return 0;
}</span>



带形参和返回值的Block

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
 
int main(int argc, const char * argv[])
{
    int (^sumBlock)(int, int) = ^(int a, int b){
        return a + b;
    };
    NSLog(@"%d", sumBlock(3, 6));
   return 0;
}</span>



3.使用typedef定义block类型

每次我们要定义一个block类型变量,都要写一大串代码,利用C语言中的typedef函数可以简化我们的定义。

<span style="background-color: rgb(255, 255, 255);">#import <Foundation/Foundation.h>
typedef int (^MyBlock)(int, int);
int main(int argc, const char * argv[])
{
    MyBlock sumBlock = ^(int a, int b){
        return a + b;
    };
    NSLog(@"%d", sumBlock(3, 6));
   return 0;
}</span>


4.Block访问外面变量

默认情况下,Block对外面变量是只读的,如果想要某个变量能在Block内部修改,需要在变量前加上__block关键字。如__block int sum = 10;

 


二、@protocol


1.protocol简介

Protocol是意思是协议。在计算机网络课程中,我们学过各种网络协议。OC中的@protocol可以类比着学习,protocolOC中的作用就是声明一堆方法。


2.创建方法

和创建类类似,右击项目,在New File中选择Objective-C Protocol,然后给协议取个名字即可。

 

3.使用方法

1)协议的编写:

@protocol 协议名称

@关键字

方法声明

@end

关键字有@required@optional

@required要求遵守协议的类必须实现,@optional是可选实现,默认是@required


2)某个类遵守协议(可遵守多个):

@interface 类名 : 父类 <协议名称1,协议名称2>

@end



 

4.协议间的遵守,基协议

和类的继承、基类类似,一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明,和类不同的是,一个协议可以遵守多个协议

@protocol 协议名称 <协议1, 协议2>

@end

和基类一样,基协议名称也叫NSObject。打开NSObject.h

 

发现里面有我们内存管理方法的声明,可是我们之前学内存管理的时候没有用过基协议呀?

那是因为,基类本身继承了基协议,我们继承基类,也就默认遵守了基协议。

 

 

5.定义变量时指定协议

<span style="background-color: rgb(255, 255, 255);">// NSObject类型的对象,并且要遵守MyProtocol协议
NSObject<MyProtocol> *obj;
// 任何OC对象,并且要遵守MyProtocol协议
id<MyProtocol> obj;
// 调用set方法要遵守MyProtocol协议
@property (nonatomic, strong) id<MyProtocol> obj;</span>

当赋值给obj的对象不遵守MyProtocol时,编译器就会发出严重警告

最后需要补充的是,在类里面我们学过,如果编译器不需要用到类里面的内容,只需要知道它是一个类,使用@class关键字。协议同样也有这种用法,在只需要知道协议的地方不用#import,使用@protocol,在真正用到协议里面方法声明的文件里,才用#import




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值