IOS中Block总结

1.block分为 

      (1).NSGlobalBlock:类似函数,位于text段;(没有引用外部变量的block,NSGlobalBlock的copy和retain是无效)

      (2).NSStackBlock:位于栈内存,函数返回后Block将无效;(引用外部的block,局部的NSStackBlock返回时在MRC下报错,在ARC下会自动加上copy)

      (3).NSMallocBlock:位于堆内存。(copy后的block都是NSMallocBlock,增加引用计数)

二. block在ARC和非ARC下__block作用

    在MRC下 __block不会retain变量,只是让block不占有变量可以避免循环引用,类似ARC下的__weak

    在ARC下 __block修饰变量,会retain变量,避免不了循环引用。要用__weak避免循环引用。

    用__block时相当于提升了变量的作用域,相当于是static和全局变量作用。

三.block其他

   copy块时,会把block中用引用的外部加__block修饰int float变量copy到栈上,用到object会复制到堆上,当多次copy次block时变量只copy一次。(没加__block的变量会作为实参传到block底部函数中,此变量非彼变量,函数返回后block内变量仍可用)

    block外部用__weak避免循环引用在block内用__strong修饰可以在block对变量强引用,避免了变量提前释放。

    block声明时必须用copy,这样声明的block属性是NSMallocBlock在dealloc销毁,其他属性声明时相当于block是在栈上声明,局部使用完就会销毁block,里面的对象也会被释放。


四.block示例

你可能感兴趣的:(IOS中Block总结)