標籤:
一、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