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,里面的对象也会被释放。
网友评论