Block基本用法

2022-05-12 03:10:04 字數 2952 閱讀 2312

block在ios開發中使用頻率非常高, 現總結一篇block基本用法和大家分享一下!

定義格式:= ^返回值(引數), 可以使用快捷鍵inline, 如果沒有引數或者返回值, 返回值和引數都可以省略

和函式功能相似, 儲存一段**.

block的呼叫是直接去呼叫的.

block();
在person類中定義乙個block屬性

@property(nonatomic ,strong) void(^programmer)();
在tableviewcontroller類中定義block

person *person1 = [[person alloc] init];

person.programmer = ^;

person *person2 = [[person alloc] init];

person.programmer = ^;

person *person3 = [[person alloc] init];

person.programmer = ^;

//新增進persons陣列

self.persons = @[person1,person2,person3];

在cell資料來源方法中呼叫

person *person = self.persons[indexpath.row];

if (person.programmer)

傳值有兩種情況:

@property (nonatomic, strong) void(^valueblock)(nsstring *);
在下乙個控制器中定義block, 把值傳進去

if (_valueblock)
nextvc.valueblock = ^(nsstring *value);

block作為引數, 一般在框架中使用較多.

例如: 封裝乙個加法類

在add類中定義乙個帶有block引數的方法

@property (nonatomic, assign) int result;

// int(^(int): 引數型別

-(void)add(int(^(int))addblock;

在外部controller類中定義block. 外界可以在block中隨意做一些操作, 這些操作的結果都會作為引數傳給內部

add *add = [[add alloc] init];

[add add:^int(int result)];

在add類中呼叫block, 可以直接呼叫. 也可以先儲存起來, 再在合適的地方呼叫

- (void)add:(int (^)(int))addblock

在add類定義宣告乙個返回值為block的方法

@property (nonatomic, assign) int result;

- (void(^)(int value))add;

在外部類中呼叫block

add *add = [[add alloc] init];

add.add(5);

在add類中實現方法

- (void (^)(int value))add

;}

1. 迴圈引用問題

block會把外界的強指標強引用

預設區域性變數都是強指標

__weak typeof(self) weakself = self;

typeof(self) strongself = weakself;

2. 變數引用問題
bock引用變數: 全域性變數,靜態變數,__block都是指標傳遞. 區域性變數是值傳遞
釋義:

預設block引用外部的區域性變數,並且沒有任何關鍵字修飾,都是值傳遞

如果外部變數用__block或者static修飾,就是指標傳遞,外面改了,裡面也會改

只要是全域性變數,block也是指標傳遞

3. 記憶體管理

mrc

block沒有訪問外部變數,在全域性區

如果訪問了外部變數,預設block在棧中

mrc中用copy, block才會放在堆中儲存.

釋義:

如果block沒有訪問外部的區域性變數,或者訪問的變數被static修飾,或者訪問全域性變數,那麼這個block就是全域性的

如果block訪問外部的區域性變數,那麼這個block在棧裡面的.

block如果想儲存到堆裡面,只能使用copy,不能使用retain,使用retain還是在棧裡面.

arc

如果訪問了外部變數,預設block在堆中

釋義:

如果block訪問外部的區域性變數,那麼這個block在堆裡面的.

在arc中,block使用strong,放在堆裡面儲存

能使用strong,就不要使用copy.

記憶體中幾個區

全域性區:儲存全域性變數

常量區:儲存常量

堆:手動去管理記憶體,物件

棧:基本變數,int,指標,自動管理

方法區:儲存函式

block 基本用法

專門處理 需要重複呼叫的 block 返回值相同,引數相同 在.h檔案中,宣告 typedef void typedefblock nsstring typedef int typedefbock2 inta,intb ibaction testaction id sender oc語言 self ...

block用法小計

預設情況下,任何block都是在棧中,隨時可能會被 對block設定copy屬性,block的記憶體就會放到堆裡面。book b book alloc init b.block 如果像上述寫法block所指向的 塊會強引用book的記憶體位址,使得book物件不能釋放,造成記憶體洩露。book b ...

Block用法解析

block 塊是對c做出的乙個補充,初次體驗 塊,無比的不適應。古怪的語法確實讓人不易入門甚至精通。但若能夠深入精通block的使用,會給 帶來層次上的提公升。block就是一段在將來被執行的 塊返回值型別 形參型別1 形參1,形參型別2 形參2,塊返回值型別 塊變數名 形參型別1,形參型別2,定義...