黑馬程式員_ Objective-c 之block、protocol學習筆記

來源:互聯網
上載者:User

標籤:des   style   color   io   os   使用   for   strong   sp   

一):block學習總結

block :用來儲存一段代碼。

 1、block 特點:
  1> Block封裝了一段代碼,可以在任何時候執行 
  2> Block可以作為函數或者函數的傳回值,而其本身又可以帶輸入參數或傳回值
  3> 蘋果官方建議盡量多用block,在多線程、非同步任務、集合遍曆、集合排序、動畫轉場用的很多
  4> Block可以在程式運行時憑空產生一個代碼儲存起來


 2、block的標誌:^


 3、block跟函數很像


  1> 可以儲存代碼
  2> 有傳回值
  3> 有形參
  4> 調用方式一樣
 4、定義block變數(沒有形參)
  1> myblock是變數名,後面的()代表沒有形參
   void (^myblock)() = ^(){
   NSLog(@"");
   };
  2> 沒有形參可以省略後面的小括弧
  void (^myblock)() = ^{
      NSLog(@"");
  };

  3> 利用block變數調用block內部的代碼
  myblock();
 
5、定義指向函數的指標int(*p)(int, int); 能用指向函數的指標做的東西一般用block替代


6、定義block變數(有形參)


  1> 傳回值是int,接收兩個int類型的參數
  int (^sumblock)(int,int) = ^( int n1, int n2 ){
      return n1+n2;
  };
  2> 調用
  int a =  sumblock(3,4);
  3> 輸出
  NSLog(@"%d", a);


7、使用typedef定義指向函數的指標類型


typedef int (*SumP)(int,int);


8、使用typedef定義block類型


  1> typedef int (^MyBlock)(int,int);
  2> 用block計算兩個值的和
  MyBlock sumBlock = ^(int  a, int b){
      return a + b;
   };

 

小結


block要掌握的東西


 1、如何定義block變數


 int (^sumBlock)(int,int);
 void(^myBlock);
 
 2、如何利用block封裝代碼


  1> 有形參
 ^(int a, int b) {
    return a-b;
 }
  2> 沒有形參
 ^() {
    NSLog(@"");
 }
 
 3、block訪問外面變數
  1> block內部可以訪問外面的變數
  2> 預設情況下,block內部不能修改外面的局部變數
  3> 給局部變數加上__block,這個局部變數就可以在block內部修改
 
 4、利用typedef定義block類型
 
 typedef int (^MyBlock)(int, int);   以後就可以利用MYBlock這種類型來定義block變數
 
  1> 先定義變數再進行賦值
MyBlock b1,b2;

b1 = ^(int a, int b){
    return a+b;
};

  2> 定義變數同時賦值
MyBlock b3 = ^(int a, int b){
    return a+b;
};

 

 

二) protocol學習總結

 


 1、定義了一個叫MyProtocol的協議


  1> @protocol僅僅是用來聲明方法的,聲明完方法後等著類來實現
  2> 只要類遵守了這個協議就意味著這個類擁有了這個協議的所有方法聲明
  3> 對這個方法可以加個關鍵字來約束這個方法要不要實現,@required代表必須實現,不實現就會發送警告,預設的就是這個@optional可以不實現
  4> NSObject,它是一個基協議,最根本最基本的協議
    protocol MyProtocol
    @required  必須實現
    - (void)test;
    @optional  可以不實現
    - (void)test2;
    @end

 2、協議的遵守


   1> 只有一個類遵守了某一個協議,就擁有了這份協議中的所有方法聲明
   2> : 繼承父類
   3> <> 遵守協議
   4> 可以遵守多個協議,在<>裡面協議之前用逗號隔開
  @interface Person : NSObject
  @end
   5> 要求obj3儲存對象必須遵守Myprotocol
   NSObject *obj3 = [[NSObject alloc] init];
   6> 代表利用set方法設定這個對象的時候,這個對象必須遵守這個協議
  @property (nonatomic, strong) id obj;

 

 3、協議遵守協議


    一個協議遵守了另外一個協議,就可以擁有這份協議的所有方法聲明
  @protocol MyProtocol3

 

 4、協議的規範

 


   1> 告訴編譯器這兩個傢伙是個協議,可以取代import
   2> 這樣在.m檔案裡就要包含協議的.h標頭檔
   3> 遵守原則,先寫協議,真正要用的時候再寫標頭檔,提高效能
  @protocol MyProtocol2;
  @protocol MyProtocol3;

 

總結


 1、協議的定義
 @protocol 協議名稱
 // 方法聲明列表
 @end
 
 2、如何遵守協議
  1> 類遵守協議
 @interface 類名 :父類名 <協議名稱1,協議名稱2>
 @end
 
  2> 協議遵守協議
 @protocol 協議名稱 <其他協議名稱1,其他協議名稱2>
 @end
 
 3、.協議中方法聲明的關鍵字
  1> @required(預設)
 要求實現,如果沒有實現會發生警告
  2> @optional
 不要求實現,怎樣都不會有警告
 
 4、定義一個變數的時候,限制這個變數儲存的對象遵守某個協議
  1> 類名<協議名稱> *變數名;
  2> id<協議名稱> 變數名;
  3> NSObject *obj;
  4> id obj;
 如果沒有遵守對應的協議,編譯器會警告
 
 5、@property中聲明的屬性也可以用做一個遵守協議的限制
  1> @property (nonatomic, strong) 類名<協議名稱> *屬性名稱
  2> @property (nonatomic, strong) id<協議名稱> 屬性名稱
  3> @property (nonatomic, strong) Dog *dog;
  4> @property (nonatomic, strong) id dog;
 
 6、協議可以定義在單獨.h檔案中,也可以定義在某個類中
  1>如果這個協議只用在某個類中,應該把協議定義在該類中
  2>如果這個協議用在很多類中,就應該定義在單獨檔案中
 
 7、分類可以定義在單獨.h檔案中,也可以定義在原來類中
  1> 一般情況下,都是定義在單獨檔案中
  2> 定義在原來類中的類,只要求能看懂文法

 8、基協議
  1> NSObject是個基類,最根本最基本的類,任何類最終都要繼承他
  2> 其實還有個協議,名字也叫NSObject,它是一個基協議,最根本最基本的協議
  3> NSObject協議中聲明很多最基本的方法,比如description,retatin、release
  4> 建議每個協議都要遵守基協議

protocol的代理


1> 僅僅告訴編譯器Button是一個類
@class Button;
2> 定義一個協議,並且遵守基協議
@protocol ButtonDelegate
3> 監聽器的思想,當某個按鈕被點擊了會告示他哪個按鈕被點擊了
- (void)onClick:(Button *)but;
@end
4> 使Button 這個類遵守協議
@interface Button : NSObject
- (void)click;
5> 聲明中的屬性遵守這個協議
@property (nonatomic, retain) id delegate;
@end
@implementation Button
6> 防止unrecognized selector sent to instance 0x100114f10,方法未實現或沒有這個方法,判斷有沒有實現這個方法
- (void)click
{
    如果_delegate實現onClick:方法,就調用這個方法
    if ([_delegate respondsToSelector:@selector(onClick:)])
    {
         按鈕被點擊了就應該通知監聽器,並且告訴監聽器哪個按鈕被點擊了
        [_delegate onClick:self];
    }
    else
    {
        NSLog(@"監聽器沒有實現onClick:方法");
    }
}
@end

block作為代理回調
#import
1> 僅僅告訴編譯器Button是個類
@class Button;
2> 用typedef定義block類型,沒有傳回值
typedef void (^MyButton)(Button *);

@interface Button : NSObject
3> 定義一個自動產生MyButton類型的setter和getter,產生_btn這個成員變數
@property (nonatomic, assign) MyButton btn;
- (void)click;
@end

@implementation Button
4> 方法實現,用_btn變數調用block內部的代碼
- (void)click
{
    調用block
     _btn(self);
}
@end

int main()
{
    @autoreleasepool {
        Button *b = [[[Button alloc] init] autorelease];

 調用setter方法
       b.btn = ^(Button *btn){
       
            NSLog(@"點了這個-%@按鈕", btn);
       };
       
 調用方法
       [b click];
 
    }
    return 0;
}

補充:判斷stu有沒有遵守這個協議
 Student *stu = [[[Student alloc] init] autorelease];
       
        if ([stu conformsToProtocol:@protocol(Study)])
        {
            NSLog(@"%@遵守了這個協議",stu);
        }

黑馬程式員_ Objective-c 之block、protocol學習筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.