一程腹、【掌握】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é)議當中的方法。