3.OC-block和protocol

一、【掌握】block的typedef


定义1个叫做:MyBlock的数据类型,它存储的代码必须返回int,,必须接受2个int类型参数

typedef int(^MyBlock)(int,int);

重命名之后,可这样使用:

MyBlock minusBlock = ^(int num1,intnum2){

returnnum1 - num2;

};


二、Block访问外部变量


block内部可以直接访问外部变量,但不可修改

加了双下划线block修饰的外部变量,可以在block内部修改,否则不可修改。

                __block int a = 10;

        void (^mblock)() = ^

        {

            a = 20;

            NSLog(@"%d",a);

        };

        mblock();


你给我注点意

block还可以做函数的参数


void preWork(void (^workBlock)());


做函数的返回值


typedef int(^myBlock) (intnum1,int num2);


myBlock test()

{

    myBlock work = ^(int x,int y)

    {

        return x + y;

    };

    return work;

}

block结构的快速提示:

输入:inlineBlock


三、Protocol概念及基本使用


1.什么是protocol?


中文意思是:协议。

协议中只能声明一些方法。

遵守了协议,就等用户拥有了协议中的所有方法。


2.协议的基本用法


协议的定义格式

@protocol 协议名称

//各种方法

@end

协议的使用格式

@interface 类名:NSObject<协议名1,协议名2,…>

@end


3.protocol的基本使用


想要给不类添加相同方法时,可以使用协议。

如:人和狗都能吃东西,都能跑,能跳,但是不存在继承关系。

// 导入运动协议的头文件#import"SportProtocol.h"

// 遵守运动协议@interfacePerson : NSObject

@end

然后直接在.m文件中实现即可

注意:当遵守了协议,而没有实现协议中的方法时,会报警告(⚠)

4.【掌握】protocol的其他用法


1.【理解】protocol的使用注意

把同一类方法,放到一个协议中去

一个类可以同时遵守多个协议

父类遵守了某个协议,子类也遵守该协议

协议遵守协议:一个协议可以遵守多个协议

2.【掌握】protocol基协议介绍

@protocol SportProtocol

@end

此处的NSObject就是基协议,意义等同于继承NSObject。

继承基协议的好处:能够拥有基协议当中声明的所有方法。、

总结:

需要添加成员变量和方法时,建议使用继承

只需要添加方法时,建议使用分类

当很多不同类中,有共同的方法可以抽取时,类之间不存在继承关系,建议使用协议。


5.【掌握】protocol中@required和@optional


@required:用@required修饰的方法,必须实现

@optional:用@optional修饰的方法,可实现,也可不实现

@required和@optional的主要意义:一般用于程序员交流用


id和instancetype的区别

1)instancetype只能作为函数或者方法的返回值

2)id能作为方法或者参数的数据类型、返回值,也能用来定义变量。

3)instancetype对比id的好处:

能精确的限制返回值的具体类型。


6.【理解】protocol的使用补充


1.protocol的引用方式

类似@class的使用方式

在需要遵守协议的地方,使用@protocol协议名

 // 使用@protocol是告诉编译器,这是一个协议


@protocol SportProtocol;


@interface Person : NSObject

- (void)run;

@end

注意:在.m文件中

使用#import引入协议的头文件

实现协议对应的方法

2.在类的声明中,定义协议(不要再单独把协议定义在xx.h文件中)

@protocol SportProtocol;

- (

void)run;

@end

@interface Person : NSObject

@end

缺点:不够灵活


7.【掌握】protocol代理设计模式概念


代理模式概念

传入的对象,代替当前类完成了某个功能,称为代理模式

利用协议实现代理模式的主要思路为:

定义一个协议,里面声明代理类需要实现的方法列表,比如这里:一个代理类需要实现:feedBaby与HongSleep方法

创建一个代理类(比如BaoMu),遵守上面的代理协议

在需要代理的类中(Baby),定义一个对象类型为id且遵守代理协议的成员变量。(delegate)

在Baby类中调用成员变量delegate(代理)的方法,调用代理类的方法

Main.m或其他使用Baby类的文件中,为Baby类的成员变量(代理类)赋值


protocol代理模式应用场合

代理设计模式的场合:

当对象A发生了一些行为,想告知对象B

      (让对象B成为对象A的代理对象)

对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)

当对象A无法处理某些行为的时候,想让对象B帮忙处理。(让对象B成为对象A的代理对象)

1)监听器的场合

Teacher想监听Baby的一些行为

2)通知的场合

Baby发生了一些行为,想告知Teacher

3)有些事情,不想自己处理,想交给别人处理

Baby发生了一些行为,但是自己不会处理,可以交给Teacher处理。


8.【掌握】protocol类型限制

类型限制:

id d = [[Person alloc] init];

要求:变量d指向的对象必须遵守PlayProtocol协议

id d = [[Person alloc] init];

要求:要求Person创建出来的对象,必须遵守PlayProtocol协议。

Person < PlayProtocol > *p = [[Person alloc] init];

真实使用场景:

@interface Person :NSObject

@end

这样创建的任何对象,都拥有协议当中的方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 1 Block机制 (Very Good) Block技巧与底层解析 http://www.jianshu.com...
    Kevin_Junbaozi阅读 4,035评论 3 48
  • Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。...
    Coder_JMicheal阅读 716评论 2 1
  • 概述 在C#异步编程时我们经常进行函数回调,由于函数调用时异步执行的,如果我们想让一个操作执行完成之后再执行另一个...
    宋进锋阅读 17,945评论 1 7
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 正值小学期,学业已荒废好久,看剧看到无聊,睡觉时间也乱七八糟。就在这段像等待命运安排一样的时间里,在简书安家...
    内心戏很多的慵懒猫阅读 411评论 0 0