1、概念函數
BLOCK是什麼?蘋果推薦的類型,效率高,在運行中保存代碼。用來封裝和保存代碼,有點像函數,BLOCK能夠在任什麼時候候執行。atom
BOLCK和函數的類似性:(1)能夠保存代碼(2)有返回值(3)有形參(4)調用方式同樣。spa
2、定義code
block變量的定義:對象
返回值 函數名 (參數,參數)blog
返回值 (^block名)(參數)內存
block定義以後,只有當調用這個block的時候纔會返回來執行具體的代碼塊內存管理
例如:io
void (^test)(void) = ^{ //具體執行某件事情的代碼塊
for (int i = 0; i < 5; i++) { NSLog(@"-----%d" , i+1); } };
NSLog(@"*****"); class
test();
int (^add)(int, int) = ^(int a, int b){ return a + b; }; int result = add(1, 2);
3、block中的內存管理
1.建立一個block實際上就是分配一片獨立的內存空間,去運行block裏面的代碼塊,這個代碼塊的內存空間已經脫離定義的那個位置了,可是block會保存定義的那個上下文(運行環境)換句話說就是copy了一份上下文,因此在block裏面能夠訪問外部的變量,可是沒法改變外部變量的值,若是非要訪訪問,能夠經過在變量前添加一個__block
2. block容易造成循環引用
當在block裏面調用某一個類的屬性或者方法,用self.name [self test], block會對這個對象進行強引用
__weak typeof(self) weakSelf = self;強制轉換爲弱引用,防止循環引用
3.block變量用copy修飾
例如:
main.m
__block int a = 10; Person *jz = [Person new]; void (^change)(int) = ^(int temp){ a++; jz.name = @"jack"; NSLog(@"a = %d", a); }; change(a); NSLog(@"%@", jz.name);
Person.h
@property (nonatomic, strong) NSString *name;
4、使用block作回調
1.先定義好block 而後再去使用
void (^dddd)(int) = ^(int a){ NSLog(@"回調過來 %d", a); }; Person *p = [Person new]; [p test:dddd];
2.在調用方法的同時去定義這個block
[p test:^(int count) { NSLog(@"回調過來 %d", count); }];
Person.h
@interface Person : NSObject //對block進行類型重定義 爲了更好的閱讀
typedef void (^CallBack)(int count); @property (nonatomic, strong) NSString *name; - (void)test:(CallBack)block; @end
Person.m
#import "Person.h"
@implementation Person - (void)test:(CallBack)block{ //回調數據
block(10); } @end
3.block作回調例子:delegates例子用block實現
Agent.h
#import <Foundation/Foundation.h> typedef void(^CompleteBlock)(NSString *name); @interface Agent : NSObject - (void)rentHouse:(CompleteBlock)block; @end
Agent.m
#import "Agent.h"
@implementation Agent -(void)rentHouse:(CompleteBlock)block{ block(@"Jack"); } @end
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject - (void)needHouse; @end
Person.m
#import "Person.h"
#import "Agent.h"
@implementation Person - (void)needHouse{ Agent *xw = [Agent new]; [xw rentHouse:^(NSString *name) { NSLog(@"你好%@", name); }]; } @end