zoukankan      html  css  js  c++  java
  • __block 与 __weak的区别理解

     1 __block 与 __weak的区别理解
     2  3 Blocks理解:
     4 
     5 Blocks可以访问局部变量,但是不能修改
     6 
     7 如果修改局部变量,需要加__block
     8 
     9 
    10  __block int multiplier = 7;
    11      int (^myBlock)(int) = ^(int num) {
    12          multiplier ++;//这样就可以了
    13          return num * multiplier;
    14      };
    15 2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。如:
    16 
    17 
    18 NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
    19     NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
    20     [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
    21         [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
    22     }];
    23    
    24     NSLog(@"%@",mArrayCount);
    25 例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。
    26 
    27 这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。
    28 
    29 但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。
    30 
    31 
    32 
    33 __weak __typeof(&*self)weakSelf =self; 等同于
    34 
    35 __weak UIViewController *weakSelf =self;
    36 
    37 为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。
    38 
    39 扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer
    40 
    41 
    42 在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain
    43 
    44 注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)
    45 
    46 1、如果你通过引用来访问一个实例变量,self会被retain。
    47 2、如果你通过值来访问一个实例变量,那么变量会被retain
  • 相关阅读:
    【BZOJ】1626: [Usaco2007 Dec]Building Roads 修建道路(kruskal)
    【BZOJ】1669: [Usaco2006 Oct]Hungry Cows饥饿的奶牛(lis)
    【BZOJ】1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏(刷水严重)
    【BZOJ】1699: [Usaco2007 Jan]Balanced Lineup排队(rmq/树状数组)
    【BZOJ】1625: [Usaco2007 Dec]宝石手镯(01背包)
    【BZOJ】1617: [Usaco2008 Mar]River Crossing渡河问题(dp)
    【BZOJ】1618: [Usaco2008 Nov]Buying Hay 购买干草(dp)
    【BZOJ】1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛(dp/-bfs)
    【BZOJ】1613: [Usaco2007 Jan]Running贝茜的晨练计划(dp)
    【BZOJ】1612: [Usaco2008 Jan]Cow Contest奶牛的比赛(floyd/dfs)
  • 原文地址:https://www.cnblogs.com/developer-ios/p/4854739.html
Copyright © 2011-2022 走看看