iOS知識梳理9:block塊

(ps.本文提到有typedef和typeof)

block是帶有自動變量的匿名函數(shù).

  • 匿名函數(shù)
    匿名函數(shù)顧名思義就是不帶名字的函數(shù)名扛,在C語言中不允許這樣的方法存在誓篱,而在OC中的Block則可以用指針來直接調(diào)用一個函數(shù)仍劈。
  • 自動變量
    block可以截獲變量的瞬時值....截獲的變量可以進行操作而不能進行賦值.
    block中不能再改變變量的值.....如果需要改變變量的值需要在變量聲明時加上__Block修飾符.
    block不支持C語言數(shù)組.
block語法

一個完整的block

 ^ NSString *(NSString *a,NSString *b){
        return a;
    };

"^" block標識......."NSString *"返回值...."(NSString *a,NSString *b)"參數(shù)列表..
其實我們可以直接省略返回值....沒有參數(shù)的時候也可以省略返回值.

^ {
        NSLog(@"hello world");
   };
block變量

其實就是一個指向block的指針.

int (^blockName)(int arg1,int arg2);

我們可以通過等號賦值直接給block變量賦值,

int (^blockName)(int arg1,int arg2) = ^(int arg1, int  arg2){
      return arg1 + arg2;
};
block當作函數(shù)參數(shù)

我們可以先聲明一個block變量.并加上typedef標識符
(typedef表示為已知的類型起別名,在這里表示為block取一個叫MyBlock的別名,這樣我們再定義這個block類型是就可以直接用Myblock,而不必加上其他額外的東西)

typedef void (^MyBlock)(NSString *s1,UIColor *c);

我們來聲明一個函數(shù):

-(void)func:(MyBlock)block{
           block(@"str",[UIColor redColor]);
}

我們可以使用這個函數(shù):

[self func:^(NSString *s1, UIColor *c){
        NSLog(@"%@",s1);
        self.view.backgroundColor = c;
}];
循環(huán)引用問題

block在ios開發(fā)中被視為一個對象....由于block的捕獲變量的機制...使得block的對象也有可能被block持有,從而形成循環(huán)應用,導致兩者都不能被釋放...
如下,

@implementation LXDObject
{
    void (^_cycleReferenceBlock)(void);
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    _cycleReferenceBlock = ^{
        NSLog(@"%@", self);   //引發(fā)循環(huán)引用
    };
}
@end

我們可以通過__weak關(guān)鍵字來修飾變量,解決循環(huán)引用問題

__weak typeof(*&self) weakSelf = self;
_cycleReferenceBlock = ^{
    NSLog(@"%@", weakSelf);   //弱指針引用,不會造成循環(huán)引用
};

(typeof可以根據(jù)括號內(nèi)的變量,自動識別變量類型并返回該類型)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末湘纵,一起剝皮案震驚了整個濱河市镶蹋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沐兰,老刑警劉巖哆档,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異住闯,居然都是意外死亡瓜浸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門比原,熙熙樓的掌柜王于貴愁眉苦臉地迎上來插佛,“玉大人,你說我怎么就攤上這事量窘」涂埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵蚌铜,是天一觀的道長锨侯。 經(jīng)常有香客問我,道長厘线,這世上最難降的妖魔是什么识腿? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮造壮,結(jié)果婚禮上渡讼,老公的妹妹穿的比我還像新娘。我一直安慰自己耳璧,他們只是感情好成箫,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旨枯,像睡著了一般蹬昌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上攀隔,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天皂贩,我揣著相機與錄音栖榨,去河邊找鬼。 笑死明刷,一個胖子當著我的面吹牛婴栽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辈末,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼愚争,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挤聘?” 一聲冷哼從身側(cè)響起轰枝,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎组去,沒想到半個月后鞍陨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡添怔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年湾戳,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片广料。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡砾脑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾杏,到底是詐尸還是另有隱情韧衣,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布购桑,位于F島的核電站畅铭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勃蜘。R本人自食惡果不足惜硕噩,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缭贡。 院中可真熱鬧炉擅,春花似錦、人聲如沸阳惹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莹汤。三九已至快鱼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抹竹。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工线罕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人柒莉。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓闻坚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親兢孝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • iOS代碼塊Block 概述 代碼塊Block是蘋果在iOS4開始引入的對C語言的擴展,用來實現(xiàn)匿名函數(shù)的特性,B...
    smile刺客閱讀 2,335評論 2 26
  • Block使用場景仅偎,可以在兩個界面的傳值跨蟹,也可以對代碼封裝作為參數(shù)的傳遞等。用過GCD就知道Block的精妙之處橘沥。...
    Coder_JMicheal閱讀 721評論 2 1
  • 前言 Blocks是C語言的擴充功能窗轩,而Apple 在OS X Snow Leopard 和 iOS 4中引入了這...
    小人不才閱讀 3,759評論 0 23
  • 《Objective-C高級編程》是一本有趣又難懂的書,全書就講了引用計數(shù)座咆、Block痢艺、GCD三個概念,有趣是因為...
    kamous閱讀 55,212評論 22 206
  • 我從深埋中的青春中醒來 我越過疲憊的年歲 只為你沉靜而熾熱的臉 那月光蔓延著的夢醒的迷醉 你的遼闊 勝過繁茂的人間...
    擺渡人memory閱讀 457評論 2 0