一、block
1> 基本使用
2> block與函數的相同點
3> block對外部變量的訪問
4> 用typedef定義block類型與函數類型
定義block類型
① 格式:typedef int (^myBlock)(int, int);② myBlock是新的block類型的名字③ myBlock前的int是block的返回值類型④ myBlock后的小括號是形參列表
函數類型
① 格式:typedef int (*fun)(int, int);② fun是新的函數類型的名字③ fun前的int是函數的返回值類型④ fun后的小括號是函數的形參列表
5> 示例
/* 1.使用typedef定義分別一個block類型,一個指向函數的指針 2.分別定義一個求和函數,用函數指針指向它 3.用新的block類型定義一個求和的block 4.定義一個輸出一條橫下的block 5.分別用函數指針和block實現兩個數的求和,中間輸出一條橫線 */#import <Foundation/Foundation.h>//用typedef定義一個返回值類型為int,有兩個int類型形參的block類型typedef int (^myBlock)(int, int);//用typedef定義一個返回值類型為int,有兩個int類型形參的函數指針typedef int (*sumP)(int, int);//定義一個求和函數int sum(int a, int b){ return a + b;}int main(){ //使用新的block類型定義一個求和的block myBlock sumBlock =^(int a, int b){ return a + b; }; //定義一個輸出橫線的block void (^lineBLock)() = ^{ NSLog(@"--------------"); }; //使函數指針指向求和函數 sumP p = sum; //通過block輸出兩個函數的和 NSLog(@"%d", sumBlock(11, 12)); //通過block輸出一條橫線 lineBLock(); //通過函數指針輸出兩個數的和 NSLog(@"%d", sumBlock(11, 12)); return 0;}
二、PRotocol
1> 基本使用
作用
① 聲明一個方法列表,不能擴充成員變量② 若一個類/協議遵守該協議,就會擁有該協議的方法列表③ 可以使用@protocol 提前聲明一個協議
定義
① 格式 @protocol MyProtocol < BaseProtocol > 方法列表 @end 1)MyProtocol指定協議的名稱 2)BaseProtocol指定該協議遵守的協議,通常遵守的是基協議, 如:NSObject② @required與@optional 1)@required:默認為該關鍵字,所定義的方法列表要求遵守該 協議的類在實現文件中必須實現,不實現會發出警告 2)@optional:所定義的方法列表不要求遵守該協議的類實現
2> 協議遵守
類遵守協議
① 格式 @interface Name:NSObject < MyProtocol > @end 1)Name是類名,MyProtocol是協議名 2)Name類將擁有協議MyProtocol聲明的所有方法
協議遵守協議
① 格式如協議的定義 1)MyProtocol協議將會擁有BaseProtocol協議中聲明的所有方法
3> @property的參數
作用
① 限制成員變量只能接受遵守某種協議的對象
格式
① @property (nonautomic, retain) id< MyProtocol > obj 1)MyProtocol限定obj只能接收遵守MyProtocol協議的對象 2)在相互引用的兩個類中,retain參數在另一端要使用assign
4> 協議與分類
協議
① 若為多個不相關的類擴充方法列表,通常使用協議② 若父類遵守該協議,則子類也遵守該協議③ 若一個協議只被一個類遵守,通常把該協議定義在該類中④ 若一個協議被多個類遵守,通常把該協議定義在定義成單獨的文件
分類
① 若為單個類或多個相互繼承的類擴充方法列表,通常使用分類② 若父類用有一個分類,則該類的子類也將擁有該分類③ 分類通常定義在單獨的文件中
5> 協議的應用
代理模式
① 組成 1)抽象角色:通過接口或抽象類聲明真實角色實現的業務方法 2)代理角色:實現抽象角色,是真實角色的代理,通過真實角色 的業務邏輯方法來實現抽象方法,并可以附加自己的操作 3)真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯, 供代理角色調用② 實例 1)主人委托保姆照顧孩子 2)老板委托秘書購買機票
協議在代理模式中的應用
① 通常情況下真是角色要定義自己的代理必須實現的規則② 協議用來來實現代理所要遵循的規則③ 遵循真實角色協議的對象,都可以作為真是角色的代理
6> 示例
/******main.m文件******/#import <Foundation/Foundation.h>#import "Parent.h"#import "Children.h"#import "Nanny.h"int main(){ @autoreleasepool { //定義一個Parent對象 Parent *p = [[Parent alloc] init]; //定義一個Children對象 Children *c = [[Children alloc] init]; //定義一個Nanny對象 Nanny *n = [[Nanny alloc] init]; //將對象p的屬性Children初始化為c p.children = c; //將對象p的屬性nanny初始化為n p.nanny = n; //調用對象p的takeCareTheChildren方法 [p takeCareTheChildren]; } return 0;}/******Parent.h文件******/#import <Foundation/Foundation.h>//#import "LookAfterTheChildren.h"//#import "Children.h"#import "Nanny.h"@interface Parent : NSObject//聲明成員變量nanny,且限定其只能接收遵守LookAfterTheChildren協議的對象@property (nonatomic, strong) id<LookAfterTheChildren> nanny;//聲明成員變量children@property (nonatomic, strong) Children *children;//定義方法,實現照顧children的功能- (void)takeCareTheChildren;@end/******Parent.m文件******/#import "Parent.h"@implementation Parent//- (void)takeCareTheChildren{ //委托代理nanny來完成照顧children的任務 [_nanny feedTheChildren]; [_nanny playWithTheChildren];}@end/******Children.h文件******/#import <Foundation/Foundation.h>@interface Children : NSObject@end/******Children.m文件******/#import "Children.h"@implementation Children@end/******Nanny.h文件******/#import <Foundation/Foundation.h>//#import "LookAfterTheChildren.h"//要想成為Parent的代理,必須遵守LookAfterTheChildren協議@interface Nanny : NSObject<LookAfterTheChildren>@end/******Nanny.m文件******/#import "Nanny.h"@implementation Nanny//實現LookAfterTheChildren協議的方法,具備照顧children的能力- (void)feedTheChildren{ NSLog(@"喂孩子吃飯");}- (void)playWithTheChildren{ NSLog(@"陪孩子玩耍");}@end/******LookAfterTheChildren.h文件******/#import <Foundation/Foundation.h>//由Parent定義的協議,聲明照顧children的方法列表@protocol LookAfterTheChildren <NSObject>//給children喂飯的方法- (void)feedTheChildren;//陪children玩耍的方法- (void)playWithTheChildren;@end
新聞熱點
疑難解答