• 关于block知识点总结


    1:什么是block?

    block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的.

    2:block要用copy修饰,还是用strong

    block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。
    使用retain也可以,但是block的retain行为默认是用copy的行为实现的,

    因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。

    如果语法块仅仅是执行而不再回调回去了, 比如操作某个数据库,修改某个单利类的属性,发送某个通知之类的,则可以用weak来修饰。

    有人会问:
    为什么不能这里不都用copy呢,原因是 优化内存。  如果这个类要传入1000Block来执行,而这个类又不会马上释放掉的话,用copy是不是就拷贝了1000个在堆里面? 这样就会占用很大一部分内存,如果使用了weak将不必要的执行后就可以马上释放掉是不是就节约了很多的内存了。
     
    3:__block有什么用?
     
    __block在MRC中有两个作用.1,允许block中访问和修改局部变量.  2,防止block中对引用对象进行隐式retain操作引起引用计数+1从而造成的循环引用
    __block在ARC中只有一个作用. 允许block中访问和修改局部变量

    4:__block和__weak有什么区别?

    __block不管是ARC还是MRC模式下都可以使用,可以修饰对象,可以修饰基本数据类型.      __week只能在ARC模式下使用,只能修饰对象(NSString),不能修饰基本数据类型. __block可以在block中修改变量,而__week不可以.

    如果对你有帮助请分享给身边有需要的朋友.

     

  • 相关阅读:
    Matlab Tricks(二十九) —— 使用 deal 将多个输入赋值给多个输出
    释名 —— 名称的含义、来源
    Eclipse快捷键 今天又学会了几个不常用的 收藏了
    HDU 2527
    UVAlive 2326 Moving Tables(贪心 + 区间问题)
    STM32关于优先级设定的理解 NVIC_SetPriority()
    linux6.2安装mysql
    【PAT】1009. Product of Polynomials (25)
    Android的重力传感器(3轴加速度传感器)简单实例
    out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
  • 原文地址:https://www.cnblogs.com/baxiu/p/7999419.html
Copyright © 2020-2023  润新知