ios學習之block初探

2022-09-18 08:21:19 字數 2061 閱讀 8588

block是ios4.0+和mac osx 10.6以後引進的對c語言的拓展,用來實現匿名函式的特性。所謂匿名函式,也稱閉包函式。即同意建立乙個暫時的沒有指定名稱的函式。

最經經常使用作**函式(callback)引數的值,當然也有其它使用方法。

比方說作為乙個變數值來使用,詳細使用方法將在後面介紹。

在ios中,使用脫字元「^」來宣告乙個block變數,block的內容包括在「{}」中的。而且和c語言一樣用「。

」來表示語句的結束。

詳細定義例如以下圖所看到的:

}能夠看到,上面的**,我們是在乙個函式blocktestone裡定義了乙個無返回值,無引數的block,叫做blockone。然後我們緊接著在後面呼叫了這個blockone。

由於我們的block沒有引數。所以在寫的時候還能夠簡寫成:

-(void)blocktestone

; blockone();

}

即省略了等號後面的引數列表。

控制台輸出結果:

-(void)blocktesttwo

; blocktwo(20);

}

在這裡,我們定義了乙個無返回值。引數型別為int型的block變數,名為blocktwo。然後我們呼叫了blocktwo,傳入引數20,控制台列印結果為:

- (void)blocktestthree

; nslog(@"%d", blockthree(20));

我們在這裡定義了乙個返回值為int型。而且引數為int型的block變數,然後block實現裡面列印了他的引數,最後回返乙個常量10;我們又在block列印了blockthree,而且給他傳了個引數20。

控制台列印結果為:

在這裡須要注意的是,由於我們定義的blockthree是有返回值的,所以當在他的實現中(即等號右邊大括號中)。假設沒有返回值return。編譯器會直接給我們報錯:

在這裡我們來分析一下block的儲存域。大家就了解了。先看一段**:

- (void)testblock

; int c = 10;

void(^blocktwo)(void) = ^(void);

void(^blockthree)(void) = [[blocktwo copy] autorelease];

nslog(@"blockone address == %@", blockone);

nslog(@"blocktwo address == %@", blocktwo);

nslog(@"blockthree address == %@", blockthree);

}

在上面這段**中,我們分別定義了三個block變數。blockone,blocktwo和blockthree,然後,我們分別列印了他們三個的位址,他們三個的差別是,blockone實現的不過列印一句話,沒有使用不論什麼外部變數(block定義以外的變數),而blocktwo實現的是列印了一句話。並寫使用了乙個外部變數c,而blockthree實現的是將blocktwo拷貝一分即copy一下,然後控制台列印的結果例如以下:

非常奇怪的能夠看到,這三個block分別屬於三個記憶體區域,blockone由於沒有使用不論什麼外部變數,他的儲存區域在全域性區。而blocktwo由於使用了外部變數,則一下子跑到了stack區即棧區,而blockthree由於copy了blocktwo。則變到了堆記憶體中。我們都知道。在全域性區和堆裡面儲存的物件是相對安全的,可是在棧區儲存的物件就相對危急。有可能在使用他的時候其物件已經被釋放,造成野指標,導致程式的crash。所以,我們在使用blcok的成員變數或者屬性的時候,要將其copy到堆記憶體中使用。

未完待續。。

。還有__block的使用,記得關注哦。今天實在太晚了。

Block的使用 初探Block

看了兩天的block。網上是有非常多解說與教程,也有講得非常好的。這裡就主要解說下我的理解與收穫。歡迎拍磚。所謂block。我覺得應該是乙個閉包函式。而閉包,就是說block以及內部全部的變數生命週期都在其呼叫函式的生命週期內。它一被呼叫完畢,則會被立刻釋放。這裡不講執行機制,僅僅簡要地講基本的用法...

iOS底層原理篇 十七 Block初探

1.block的分類 常見的三種block void viewdidload block nslog block 列印結果 block探析 2300 140310 我是全域性block block探析 2300 140310 nsglobalblock 0x10d14e038 void viewdi...

iOS 底層原理之 Block

block 本質上也是乙個 oc 物件,它內部也有個 isa 指標 block 是封裝了函式呼叫以及函式呼叫環境的 oc 物件 block 的底層結構如下圖所示 原始碼解析 struct gsblock load block impl 0 block impl struct block impl g...