zoukankan      html  css  js  c++  java
  • block知识总结

    一.block在内存中存在的形式

    1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象。这片区域在程序执行期会一直存在。

    2.当block句法写在函数或者方法内部时,block对象被分配在栈上。

    3.当对block执行copy操作时,如果block在栈上,则复制到堆上,如果block本来已经在堆上,则不进行复制而直接返回堆上的对象增加该对象的引用计。

    二.block内基本变量(非对象)的行为

    block可以访问它所在函数体内该函数的变量,但是对于不同的变量类型,这些变量有不同的行为。

    1.对于全局变量,block可直接访问和修改全局变量的值,因为当block访问它们时传递的是它们的指针。

    2.对于static修饰的局部变量,block可直接访问和修改变量的值,同样是因为当block访问它时传递的是它的指针。

    3.除以上两种外的局部变量(栈内变量),block只可访问值而不能修改,因为这种情况下是值传递,无法对原值进行修改。

    4.如果想在block内修改函数的局部变量,要在变量前加__block修饰符,当block访问带有__block修饰的局部变量时,传递的是该变量的地址。

    三.block内使用对象时的行为

    1.方法内的block可以直接访问实例变量,也可以改变其值。

    2.方法内的block中存在实例变量时,如果在栈上生成block的副本,retain就会被发送给self而非实例变量,引用计数器的值也会加1。实例变量的类型不一定非得是对象。

    3.block句法内存在非实例变量对象时,如果在栈上生成某个对象的副本,包含的对象就会接收到retain,引用计数器的值也会增加。

    4.已经复制后,堆区域中某个block即使收到copy方法,结果也只是block自身的引用计数器加1。包含的对象的引用计数器的值不变。

    5.复制的块对象在被释放时,也会向包含的对象发送release。

    四.ARC和非ARC下block的操作的区别

    1.由于block一般是分配在栈上的,为了能保留使用,就必须对block进行copy操作。在 ARC 下,编译器会自动检测,在需要保存block对象时自动插入copy操作,具体地说就是在被带入强访问变量以及被作为return的返回值返回的时候,编译器会对block自动进行copy操作。但当将 block 当作方法参数时候,编译器不会自动进行拷贝,需要我们手动拷贝该 block 对象。幸运的是,Cocoa 库中的大部分名称中包含”usingBlock“的接口以及 GCD 接口在其接口内部已经进行了拷贝操作,不需要我们再手动处理了。但除此之外的情况,就需要我们手动干预了。

    2.在MRC下,则完全由程序员来对block进行管理,编译不会自动进行copy操作,由此要特别小心,避免出现block被过早释放现象的发生而导致的程序崩溃。

    五.使用block注意事项

    1.使用前要做判空,运行一个空block变量将会导致程序崩溃。

    2.避免循环引用。使用block时可能会造成循环引用,很多时候一个类拥有一个block,而如果在block里我们又使用了self(该类)的实例变量,因为使用block时一般都会进行copy操作的,此时self的引用计数将被加1,形成了self拥有block,block又持有self的循环引用,要打破这种循环我们需要先定义self 的一个弱引用 wself,然后在block内用使用弱引用。

    3.在多线程环境下(block中的weakSelf有可能被析构的情况下),需要使用weak–strong dance技术,先将weakSelf转为strong指针,避免在运行到某个关键步骤时self对象被析构。

  • 相关阅读:
    GhostBSD 3.0RC3,基于GNOME的FreeBSD
    Nagios 3.4.3 发布,企业级监控系统
    Jolokia 1.0.6 发布, JMX远程访问方法
    微软希望开发人员不要使 WebKit 成为新版 IE6
    Kwort Linux 3.5 正式版发布
    EJDB 1.0.24 发布,嵌入式 JSON 数据库引擎
    Pale Moon 15.3 Firefox“苍月”优化版发布
    Galera Load Balancer 0.8.1 发布
    SmartSVN V7.5 正式发布
    PostgresQL建立索引如何避免写数据锁定
  • 原文地址:https://www.cnblogs.com/qmmq/p/5301446.html
Copyright © 2011-2022 走看看