Block总结

BLOCK

block的描述: 他是类似函数指针的一个代码块的内联封装, 他可以将一个函数体作为对象传递

block的本质: 对象

block的效率: 高于函数调用


声明一个block

           返回值 (^名称)(以”逗号”分割的参数), 参数部分可以不写参数名只写类型

范例:

              void  (^myFirstBlock)( int a, NSString *s, UIButton *button )

            BOOL (^mySecondBlock)(void)

    NSString * (^myThirdBlock)(CGFloat, float)


定义一个block

         ^可省略的返回值(以”逗号”分割的参数){代码块}

范例:

        ^void(int a){NSLog(@"一个int参数, 无返回值的block"); } 

        ^{ NSLog(@"一个无参数,无返回值的block"); }                

        ^int(int a, int b){ NSLog( @"一个两个int参数, 返回两个数相加的block, 结果%d", a + b ); return a + b; }


block作为函数参数

         block作为参数, 参数名后缀, 类型格式为: ( 返回值(^)(参数) )block名 

范例:

- (void)test:(int(^)(int))paramBlock

{

        NSLog( @"打印block返回结果:%d", paramBlock(10));

}


 block作为参数的函数调用:

         将block定义部分或将block对象传入函数调用的参数部分

范例:

[self test:^(int a){

        return a * a;

}];


__block:

block只能只读的访问局部变量, 若需要修改局部变量, 需要通过__block修饰该变量, 该修饰符会使block自动复制该对象的指针,即指针拷贝, 当对该对象执行写操作时, 其实就是操作其指针指向的对象进行操作.

若不加该修饰符, block仅自动复制需要访问的局部变量的值副本(值拷贝), 因此只能进行只读操作.

__weak:

使用block特别要注意的一点就是防止循环引用的发生, block作为一个对象被持有者持有,若block内部也持有该持有者将会导致循环引用,导致相互持有, 永远无法销毁彼此的内存问题, 若不能规避该问题, 则需要通过使用__weak修饰 block要访问的持有者变量, 防止循环引用的发生. 尤其是block所在的self.

__strong

该修饰符在block内的主要作用是防止__weak修饰的指针在block运行期间被外部销毁, 导致block无法顺利完成原定功能. 所以当访问的外部变量用__weak修饰时, block内部最好再有一个__strong修饰的同类型指针指向__weak指针, 这样就可以确保, 在block内部的这个指针可以运行完成. 随着block运行完成, __strong修饰的指针也将自动销毁, 进而__weak指针也会自动置nil.


block外部变量访问

block可以访问和修改全局变量

block只能只读的访问局部变量(值传递, block内部复制了一个副本), 若加了__block修饰, 就改为引用传递,可修改局部变量


block底层浅谈

block本身包含一个结构体

struct __block_impl

{

void *isa;

int Flags;

int Reserved;

void *FuncPtr;

}

block分为三种类型, __block_impl的isa指针负责标记block类型

_NSConcreteGlobalBlock: 全局静态block, 当block内不访问任何外部变量, 或者访问的是全局作用域,成员变量的, 属于该类型, 内存管理方式和函数一致

_NSConcreteStackBlock 栈block, 由系统管理内存, 函数返回时销毁, 访问的外部变量由block从栈上copy到堆上, 保证了作用域结束后, block仍然可以访问

_NSConcreteMallocBlock 堆block, 由开发者控制, 引用计数为0时销毁


block几种自身copy的情况, 若触发一下情况, block将自动拷贝自身到堆中, 确保自身作用域内的变量的生命周期更长久

1.显式执行copy, [block copy];

2.block作为返回值的时候

3.block被赋值给__strong类型的对象或者block的内部变量时

4.block作为参数传入带有usingBlock的CocoaFramework方法

5. block作为参数传入GCD的API时


其他:

__typeof, __typeof__, typeof 这三个关键字实现了一个相同的功能, 获取参数的类型名称并返回

UIViewController *vc;

__typeof(vc) vc2;

这样就可以在不知道vc指针类型的情况下, 再声明一个同类型的vc2

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 2.1 Blcoks概要 2.1.1 什么是Blocks Blocks是C语言的扩充功能——“带有自动变量(即局部...
    SkyMing一C阅读 2,316评论 6 18
  • 《Objective-C高级编程》这本书就讲了三个东西:自动引用计数、block、GCD,偏向于从原理上对这些内容...
    WeiHing阅读 9,792评论 10 69
  • 参考 Block编译代码解读:block没那么难(一、二、三)iOS进阶——iOS(Objective-C) 内存...
    啊哈呵阅读 805评论 0 3
  • Blocks Blocks Blocks 是带有局部变量的匿名函数 截取自动变量值 int main(){ ...
    南京小伙阅读 907评论 1 3
  • — —是否曾有一本书,是否曾有一个故事让你品味之后安静的合上它的书页,闭上眼睛不知想起为了谁流过温热的泪。是...
    狐生阅读 515评论 0 2