程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Objective-C基礎筆記(6)Block

Objective-C基礎筆記(6)Block

編輯:關於C語言

Objective-C基礎筆記(6)Block


Block(代碼段)封裝了一段代碼,可以在任何時候執行。

Block可以作為函數參數或者函數返回值,而其本身又可以帶輸入參數或返回值。它和傳統的函數指針很類似,但是有區別:block是inline(內聯函數)的,並且默認情況下它對局部變量是只讀的。

蘋果官方建議盡量多用block.在多線程、異步任務、集合遍歷、集合排序、動畫轉場用的很多。

Block的定義:

int (^MySum) (int, int) = ^(int a, int b){

return a + b;

}

定義了一個叫MySum的block對象,它帶有兩個int參數,返回int類型,等號右邊是block的具體實現。

void test(){
    //定義了一個block,這個block返回值是int類型,接收兩個int類型參數
    int (^Sum) (int, int) = ^(int a, int b){
        return a + b;
    };
    
    int a = Sum(10, 11);
    
    NSLog(@"%i", a);
}
void test2(){
    //block可以訪問局部變量,但默認情況下不能修改
    int c = 15;
    //使用__block關鍵字,變量可以在block中修改
    __block int b = 25;
    
    MySum sum = ^(int a, int b){
        NSLog(@"C is %i", c);
        b = 35;
        NSLog(@"B is %i", b);
        return a + b;
    };
    
    NSLog(@"%i", sum(10, 10));
}
在上一篇中我們實現了一個按鈕監聽器,這一篇我們使用block來實現按鈕監聽器。

\

#import 
@class Button;

typedef void (^ButtonBlock) (Button *);

@interface Button : NSObject

//這裡暫時用assign
@property (nonatomic, assign) ButtonBlock block;

//模擬按鈕點擊
- (void)click;

@end
在Button.h中我們定義了一個數據類型 void(^ButtonBlock) (Button *), 然後定義一個該類型的成員變量 ButtonBlock block;

添加了一個成員方法 - (void)click;

#import "Button.h"

@implementation Button

- (void)click {
    _block(self);
}

@end
Button.m文件中實現了 - (void)click方法
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Button *btn = [[[Button alloc] init] autorelease];
        
        btn.block = ^(Button *btn){
            NSLog(@"按鈕%@被點擊了", btn);
        };
        //模擬按鈕點擊
        [btn click];
    }
    return 0;
}
最後在主函數中我們先獲取按鈕對象,然後給按鈕對象中的block對象賦值,最後在模擬按鈕點擊事件的觸發。

細心的朋友可能會發現,這裡定義的block和c語言中的指向函數的指針特別想,兩個對比如下:

int sum1(int a, int b){
    return a + b;
}

void test3(){
    
    //Block
    int(^sum)(int, int) = ^(int a, int b){
        return a + b;
    };
    
    //指向函數的指針
    int (*sum1)(int, int) = sum1;
    
    //調用
    sum(11, 11);
    sum1(10, 10);
}
typedef int(^MySum) (int, int);
typedef int (*sum2)(int, int);

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved