国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

OC-6.block與protocol

2019-11-14 18:02:29
字體:
來源:轉載
供稿:網友

一、block

1> 基本使用

  • 相當于用來存放代碼的代碼塊
  • 效率高
  • 若沒有形參可以省略小括號

2> block與函數的相同點

  • 可以保存代碼
  • 可以有返回值
  • 可以有形參
  • 調用方式一樣

3> block對外部變量的訪問

  • 可以訪問外部變量
  • 默認情況下,不能在block內修改外部變量
  • 用關鍵字__block修飾外部變量,就可以在block內修改它

4> 用typedef定義block類型與函數類型

  1. 定義block類型

    ① 格式:typedef int (^myBlock)(int, int);② myBlock是新的block類型的名字③ myBlock前的int是block的返回值類型④ myBlock后的小括號是形參列表

     

  2. 函數類型

    ① 格式: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> 基本使用

  1. 作用

    ① 聲明一個方法列表,不能擴充成員變量② 若一個類/協議遵守該協議,就會擁有該協議的方法列表③ 可以使用@protocol 提前聲明一個協議

     

  2. 定義

    ① 格式    @protocol MyProtocol < BaseProtocol >      方法列表    @end    1)MyProtocol指定協議的名稱    2)BaseProtocol指定該協議遵守的協議,通常遵守的是基協議,      如:NSObject② @required與@optional    1)@required:默認為該關鍵字,所定義的方法列表要求遵守該      協議的類在實現文件中必須實現,不實現會發出警告    2)@optional:所定義的方法列表不要求遵守該協議的類實現

     

2> 協議遵守

  1. 類遵守協議

    ① 格式    @interface Name:NSObject < MyProtocol >    @end    1)Name是類名,MyProtocol是協議名    2)Name類將擁有協議MyProtocol聲明的所有方法

     

  2. 協議遵守協議

    ① 格式如協議的定義    1)MyProtocol協議將會擁有BaseProtocol協議中聲明的所有方法

     

3> @property的參數

  1. 作用

    ① 限制成員變量只能接受遵守某種協議的對象

     

  2. 格式

    ① @property (nonautomic, retain) id< MyProtocol > obj    1)MyProtocol限定obj只能接收遵守MyProtocol協議的對象    2)在相互引用的兩個類中,retain參數在另一端要使用assign

     

4> 協議與分類

  1. 協議

    ① 若為多個不相關的類擴充方法列表,通常使用協議② 若父類遵守該協議,則子類也遵守該協議③ 若一個協議只被一個類遵守,通常把該協議定義在該類中④ 若一個協議被多個類遵守,通常把該協議定義在定義成單獨的文件

     

  2. 分類

    ① 若為單個類或多個相互繼承的類擴充方法列表,通常使用分類② 若父類用有一個分類,則該類的子類也將擁有該分類③ 分類通常定義在單獨的文件中

     

5> 協議的應用

  1. 代理模式

    ① 組成    1)抽象角色:通過接口或抽象類聲明真實角色實現的業務方法    2)代理角色:實現抽象角色,是真實角色的代理,通過真實角色      的業務邏輯方法來實現抽象方法,并可以附加自己的操作    3)真實角色:實現抽象角色,定義真實角色所要實現的業務邏輯,      供代理角色調用② 實例    1)主人委托保姆照顧孩子    2)老板委托秘書購買機票

     

  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

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 九江县| 石棉县| 北京市| 崇阳县| 通化县| 惠安县| 郑州市| 北川| 理塘县| 大余县| 阿瓦提县| 河南省| 石屏县| 丰镇市| 华安县| 清苑县| 原平市| 饶河县| 东辽县| 通州区| 镇康县| 彭泽县| 澄城县| 庐江县| 义乌市| 阿勒泰市| 株洲县| 读书| 阿拉善右旗| 天等县| 江城| 汶上县| 丽江市| 平定县| 运城市| 廊坊市| 汝城县| 铁岭市| 泸溪县| 个旧市| 留坝县|