3.OC-block和protocol

一程腹、【掌握】block的typedef


定義1個叫做:MyBlock的數(shù)據(jù)類型,它存儲的代碼必須返回int,,必須接受2個int類型參數(shù)

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

重命名之后高镐,可這樣使用:

MyBlock minusBlock = ^(int num1,intnum2){

returnnum1 - num2;

};


二、Block訪問外部變量


block內(nèi)部可以直接訪問外部變量畸冲,但不可修改

加了雙下劃線block修飾的外部變量嫉髓,可以在block內(nèi)部修改观腊,否則不可修改。

??????????????? __block int a = 10;

? ? ? ? void (^mblock)() = ^

? ? ? ? {

? ? ? ? ? ? a = 20;

? ? ? ? ? ? NSLog(@"%d",a);

? ? ? ? };

? ? ? ? mblock();


你給我注點意

block還可以做函數(shù)的參數(shù)


void preWork(void (^workBlock)())算行;


做函數(shù)的返回值


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


myBlock test()

{

? ? myBlock work = ^(int x,int y)

? ? {

? ? ? ? return x + y;

? ? };

? ? return work;

}

block結(jié)構的快速提示:

輸入:inlineBlock


三梧油、Protocol概念及基本使用


1.什么是protocol?


中文意思是:協(xié)議州邢。

協(xié)議中只能聲明一些方法儡陨。

遵守了協(xié)議,就等用戶擁有了協(xié)議中的所有方法偷霉。


2.協(xié)議的基本用法


協(xié)議的定義格式

@protocol 協(xié)議名稱

//各種方法

@end

協(xié)議的使用格式

@interface 類名:NSObject<協(xié)議名1迄委,協(xié)議名2褐筛,…>

@end


3.protocol的基本使用


想要給不類添加相同方法時类少,可以使用協(xié)議。

如:人和狗都能吃東西渔扎,都能跑硫狞,能跳,但是不存在繼承關系晃痴。

// 導入運動協(xié)議的頭文件#import"SportProtocol.h"

// 遵守運動協(xié)議@interfacePerson : NSObject

@end

然后直接在.m文件中實現(xiàn)即可

注意:當遵守了協(xié)議残吩,而沒有實現(xiàn)協(xié)議中的方法時,會報警告(?)

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


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

把同一類方法倘核,放到一個協(xié)議中去

一個類可以同時遵守多個協(xié)議

父類遵守了某個協(xié)議泣侮,子類也遵守該協(xié)議

協(xié)議遵守協(xié)議:一個協(xié)議可以遵守多個協(xié)議

2.【掌握】protocol基協(xié)議介紹

@protocol SportProtocol

@end

此處的NSObject就是基協(xié)議,意義等同于繼承NSObject紧唱。

繼承基協(xié)議的好處:能夠擁有基協(xié)議當中聲明的所有方法活尊。、

總結(jié):

需要添加成員變量和方法時漏益,建議使用繼承

只需要添加方法時蛹锰,建議使用分類

當很多不同類中,有共同的方法可以抽取時绰疤,類之間不存在繼承關系铜犬,建議使用協(xié)議。


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


@required:用@required修飾的方法轻庆,必須實現(xiàn)

@optional:用@optional修飾的方法癣猾,可實現(xiàn),也可不實現(xiàn)

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


id和instancetype的區(qū)別

1)instancetype只能作為函數(shù)或者方法的返回值

2)id能作為方法或者參數(shù)的數(shù)據(jù)類型余爆、返回值纷宇,也能用來定義變量。

3)instancetype對比id的好處:

能精確的限制返回值的具體類型龙屉。


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


1.protocol的引用方式

類似@class的使用方式

在需要遵守協(xié)議的地方呐粘,使用@protocol協(xié)議名

?// 使用@protocol是告訴編譯器满俗,這是一個協(xié)議


@protocol SportProtocol;


@interface Person : NSObject

- (void)run;

@end

注意:在.m文件中

使用#import引入?yún)f(xié)議的頭文件

實現(xiàn)協(xié)議對應的方法

2.在類的聲明中,定義協(xié)議(不要再單獨把協(xié)議定義在xx.h文件中)

@protocol SportProtocol;

- (

void)run;

@end

@interface Person : NSObject

@end

缺點:不夠靈活


7.【掌握】protocol代理設計模式概念


代理模式概念

傳入的對象作岖,代替當前類完成了某個功能唆垃,稱為代理模式

利用協(xié)議實現(xiàn)代理模式的主要思路為:

定義一個協(xié)議,里面聲明代理類需要實現(xiàn)的方法列表痘儡,比如這里:一個代理類需要實現(xiàn):feedBaby與HongSleep方法

創(chuàng)建一個代理類(比如BaoMu)辕万,遵守上面的代理協(xié)議

在需要代理的類中(Baby),定義一個對象類型為id且遵守代理協(xié)議的成員變量沉删。(delegate)

在Baby類中調(diào)用成員變量delegate(代理)的方法渐尿,調(diào)用代理類的方法

Main.m或其他使用Baby類的文件中,為Baby類的成員變量(代理類)賦值


protocol代理模式應用場合

代理設計模式的場合:

當對象A發(fā)生了一些行為,想告知對象B

? ? ? (讓對象B成為對象A的代理對象)

對象B想監(jiān)聽對象A的一些行為 (讓對象B成為對象A的代理對象)

當對象A無法處理某些行為的時候,想讓對象B幫忙處理矾瑰。(讓對象B成為對象A的代理對象)

1)監(jiān)聽器的場合

Teacher想監(jiān)聽Baby的一些行為

2)通知的場合

Baby發(fā)生了一些行為,想告知Teacher

3)有些事情,不想自己處理,想交給別人處理

Baby發(fā)生了一些行為,但是自己不會處理,可以交給Teacher處理砖茸。


8.【掌握】protocol類型限制

類型限制:

id d = [[Person alloc] init];

要求:變量d指向的對象必須遵守PlayProtocol協(xié)議

id d = [[Person alloc] init];

要求:要求Person創(chuàng)建出來的對象,必須遵守PlayProtocol協(xié)議殴穴。

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

真實使用場景:

@interface Person :NSObject

@end

這樣創(chuàng)建的任何對象凉夯,都擁有協(xié)議當中的方法。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末采幌,一起剝皮案震驚了整個濱河市劲够,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌休傍,老刑警劉巖征绎,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異磨取,居然都是意外死亡人柿,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門寝衫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顷扩,“玉大人,你說我怎么就攤上這事慰毅“兀” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵汹胃,是天一觀的道長婶芭。 經(jīng)常有香客問我,道長着饥,這世上最難降的妖魔是什么犀农? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宰掉,結(jié)果婚禮上呵哨,老公的妹妹穿的比我還像新娘赁濒。我一直安慰自己,他們只是感情好孟害,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布拒炎。 她就那樣靜靜地躺著,像睡著了一般挨务。 火紅的嫁衣襯著肌膚如雪击你。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天谎柄,我揣著相機與錄音丁侄,去河邊找鬼。 笑死朝巫,一個胖子當著我的面吹牛鸿摇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捍歪,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼户辱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了糙臼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤恩商,失蹤者是張志新(化名)和其女友劉穎变逃,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怠堪,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡揽乱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了粟矿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凰棉。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖陌粹,靈堂內(nèi)的尸體忽然破棺而出撒犀,到底是詐尸還是另有隱情,我是刑警寧澤掏秩,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布或舞,位于F島的核電站,受9級特大地震影響蒙幻,放射性物質(zhì)發(fā)生泄漏映凳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一邮破、第九天 我趴在偏房一處隱蔽的房頂上張望诈豌。 院中可真熱鬧仆救,春花似錦、人聲如沸矫渔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚌斩。三九已至铆惑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間送膳,已是汗流浹背员魏。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叠聋,地道東北人撕阎。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像碌补,于是被迫代替她去往敵國和親虏束。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1 Block機制 (Very Good) Block技巧與底層解析 http://www.reibang.com...
    Kevin_Junbaozi閱讀 4,035評論 3 48
  • Block使用場景厦章,可以在兩個界面的傳值镇匀,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處袜啃。...
    Coder_JMicheal閱讀 718評論 2 1
  • 概述 在C#異步編程時我們經(jīng)常進行函數(shù)回調(diào)汗侵,由于函數(shù)調(diào)用時異步執(zhí)行的,如果我們想讓一個操作執(zhí)行完成之后再執(zhí)行另一個...
    宋進鋒閱讀 17,957評論 1 7
  • 1. Java基礎部分 基礎部分的順序:基本語法群发,類相關的語法晰韵,內(nèi)部類的語法,繼承相關的語法熟妓,異常的語法雪猪,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 正值小學期,學業(yè)已荒廢好久起愈,看劇看到無聊只恨,睡覺時間也亂七八糟。就在這段像等待命運安排一樣的時間里告材,在簡書安家...
    內(nèi)心戲很多的慵懶貓閱讀 413評論 0 0