ARC与MRC下,Block的不同之处

IOS block在ARC和MRC中的情况不同,请看如下文解析。

  1.  block可以存储在栈中,也可以在堆中,甚至可以存储在全局静态区域中。
  2. 默认存储在栈中,不需要管理内存。
  3. 存储在堆中的block会对block进行retain操作
  4. MRC下:block在堆中时,不想对block进行retain操作,前面加__block
  5. ARC下:block在堆中时,不想对block进行retain操作,前面加__weak或__unsafe_unretained
  6. __weak和__unsafe_unretained的区别:__weak则在释放时会对对象赋值nil,后者不会。

copy关键字使栈中的block转移到堆中,并对block引用对象进行retain操作,避免block引用的对象进行retain操作,在引用对象声明时前面加__block。

  1. void blockARC_MRC(){
  2.     __block example *ex = [[example alloc] init];
  3.     ex.ptr = 12;
  4.     NSLog(@"block引用前:d retainCount = %zd",ex.retainCount);    //1
  5.     void (^myBlock)() = ^() {
  6.         NSLog(@"ex.ptr  = %d",ex.ptr );
  7.     };
  8.     NSLog(@"block引用后:ex-retainCount = %zd",ex.retainCount);
  9.     Block_copy(myBlock);
  10.     NSLog(@"block copy后:ex- retainCount = %zd",ex.retainCount);
  11.     Block_release(myBlock);
  12.     NSLog(@"block release后:ex retainCount = %zd",ex.retainCount);
  13.     myBlock();
  14.     NSLog(@"block调用后:ex retainCount = %zd",ex.retainCount);
  15.     [ex release];
  16. }

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: