黑马程序员—OC语言基础—Block类型与Protocol协议小结

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

一、Block

Block类型是OC的有一种特殊类型,它的作用是封装代码,以便于随时可以调用,提高效率。其实这与函数的作用很类似,只是函数需要在调用前声明,而Block类型是当做一种数据类型封装,然后随时调用的。

Block的标志:^

1.没有返回值,没有形参的block

定义Block的格式:

void (^myblock)() = ^{
......
};


其实没有形参的话,()是可以省略的。

void (^myblock) = ^{
......
};

2.有返回值,有形参的block

这种写法和指向函数的指针很类似:

int (^sumblock)(int, int) = ^(int a, int b)
{
......
}

3.block的修改

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

例如:

int main()
{
    int a = 10;
    __block int b = 20;
    
    void (^block)();
    
    block = ^{
        // block内部可以访问外面的变量
        //NSLog(@"a = %d", a);
        
        // 默认情况下,block内部不能修改外面的局部变量
        // a = 20;
        
        // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改
        b = 25;
    };

4. 利用 typedef 定义 block 类型

 typedef int (^MyBlock)(int, int);
 // 以后就可以利用MyBlock这种类型来定义block变量
 MyBlock block;
 MyBlock b1, b2;
 
 b1 = ^(int a, int b) {
    return a - b;
 };
 
 MyBlock b3 = ^(int a, int b) {
    return a - b;

总结:

1)如何定义block变量

int (^sumBlock)(int, int);
void (^myBlock)();


2)如何利用block封装代码

^(int a, int b) {
    return a - b;
 };

^() {
    NSLog(@"----------");
 };

^ {
    NSLog(@"----------");
 };

3)block访问外面变量

(1)block内部可以访问外面的变量

(2)默认情况下,block内部不能修改外面的局部变量

(3)给局部变量加上__block关键字,这个局部变量就可以在block内部修改

4)利用typedef定义block类型

typedef int (^MyBlock)(int, int);
 // 以后就可以利用MyBlock这种类型来定义block变量
 MyBlock block;
 MyBlock b1, b2;
 
 b1 = ^(int a, int b) {
    return a - b;
 };
 
 MyBlock b3 = ^(int a, int b) {
    return a - b;
 };



二、Protocol协议

1.协议的概念

Protocol协议说白了就是一份声明,只要某个类遵守这份Protocol协议,就相当于拥有了这份协议所有的方法。

协议的定义方法如下:

@protocol 协议名称 <NSObject>
  // 方法声明列表....
 @end

我们在这里顺便总结一下之前学习的内容:

:代表继承;()代表分类名称;<>代表遵守协议;

2.如何遵守协议

1)类遵守协议

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

2)协议遵守协议

一个协议可遵守其他多个协议,多个协议之间用逗号隔开

一个协议遵守了其他协议,就相当于拥有了其他协议中的方法声明

@protocol 协议名称 <其他协议名称1, 其他协议名称2>
 
@end
 


3)定义一个变量时,限制这个变量保存的对象遵守某个协议

类名<协议名称>  *变量名;
id<协议名称>  变量名;

3.协议中方法声明的关键字

1)@required (默认)           要求实现,如果没有实现,会发出警告

2)@optional                      不要求实现,不会有警告

4.基协议

NSObject是个基协议,是最基本的协议

NSObject中有许多最基本的方法,如:description、retain、release等等

每一个新的协议都要遵守NSObject协议,<NSObject>

5.协议的提前声明

一般我们如果要写协议或者类时,写@Protocol和@class进行声明,当真正要用到里面的东西的时候,再在.m文件中#import

@Protocol MyProtocol;

6.@property中声明的属性也可用作一个遵守协议的限制

@property<nonatomic, strong> 类名<协议名称>  *属性名;

@property<nonatomic, strong> id<协议名称>  属性名;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值