iOS開發————對象間通訊之block

來源:互聯網
上載者:User

標籤:

一、block的概念:

 別稱:程式碼片段,塊,閉包,是蘋果公司添加到OC語言中的。

 作用:在程式啟動並執行過程中儲存一段代碼,並且這段代碼可以進行傳遞。

 應用:用於對象間的通訊。

二、block的文法:

 和函數指標的文法相似要設定block的返回值和參數個數及類型。

 (1)定義:

 無參無返回值的block變數:void (^myBlock)(void)

 有參數有返回值的block變數 int (^sumBlock)(int, int);

 (2)賦值:

 myBlock = ^{ //block中的代碼 }; sumBlock = ^(int a, int b) {    return a + b; };

 (3)調用:

 

myBlock();sumBlock(3,4); 如果參數則需要指定實參。
typedef簡化block類型的書寫:類型名第一個字母要求大寫: typedef void (^MyBlock)(void); //定義類型別名MyBlock typedef int (^AthematicBlock)(int, int); //定義類型別名AthematicBlock //可以使用類型別名來定義變數 MyBlock block1; AthematicBlock block2;

 

三、block內部去訪問外面的變數:

  預設情況下block內部不能修改外部定義的局部變數。

  給局部變數加上__block關鍵字,這個局部變數可以在block內部修改。


四、block實現對象間通訊:(保姆給小孩洗澡)

 1.確定在哪裡調用block,在哪裡傳遞block

 事件在哪裡發生(小孩髒了),就在哪裡回調block

 事件在哪裡響應(給小孩洗澡),就在哪裡實現並且傳遞block(給小孩)(靈活處理)

 

 2.調用block的類 Child

 應該定義一個block屬性,要設定copy的記憶體管理原則。

 並且在事件發生時要調用block

 

 3.傳遞block的類 Nanny

 定義一個block塊,此block中的代碼就是對這個事件作出的響應。

 將此block賦值給調用block的執行個體對象(小孩)


舉例:在小孩類中設定一個block屬性,當小孩髒了的時候調用保姆中實現的洗小孩的block的方法,最後在main中讓保姆實現洗小孩的方法

child.h

@interface Child : NSObject@property NSInteger cleanValue; //清潔度@property NSInteger happyValue; //快樂度//- (void)batheChild:(Child *)child;//定義block類型別名,模仿協議方法的聲明typedef void (^HandleBlock) (Child *);//定義一個block屬性(是HandleBlock類型的,名字是washBlock)@property (copy, nonatomic) HandleBlock washBlock;- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue;@end

child.m

#import "Child.h"@implementation Child- (instancetype)initWithCleanValue:(NSInteger)cleanValue happyValue:(NSInteger)happyValue {        self = [super init];        if (self) {                NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];                _cleanValue = cleanValue;                _happyValue = happyValue;    }    return self;}- (void)timerAction:(NSTimer *)timer {        _cleanValue--;    _happyValue--;        NSLog(@"clean:%li, happy:%li", _cleanValue, _happyValue);        //當小孩的清潔度下降某個限定值時,通知保姆來給他洗澡    if (_cleanValue == 95) {                //調用block,來針對小孩髒了這個事件的處理。        //判斷是否調用到了block        if (self.washBlock) {            self.washBlock(self);        }    }}@end

nanny.h

@class Child;@interface Nanny : NSObject- (void)washBaby:(Child *)child;@end

nanny.m

#import "Nanny.h"#import "Child.h"@implementation Nanny- (void)washBaby:(Child *)child {        child.washBlock = ^ (Child *child){        NSLog(@"小孩髒了,保姆把小孩洗白白");        child.cleanValue = 100;    };}@end

main

#import "Child.h"#import "Nanny.h"#import "Grandma.h"#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {    @autoreleasepool {                        Nanny *nanny = [[Nanny alloc] init];                Child *child = [[Child alloc] initWithCleanValue:100 happyValue:100];                        [nanny washBaby:child];                        [[NSRunLoop currentRunLoop] run];                            }    return 0;}


iOS開發————對象間通訊之block

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.