Block

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
相關文章
相關標籤/搜索