美文网首页
assign VS weak , __block 与 __wea

assign VS weak , __block 与 __wea

作者: Ming普 | 来源:发表于2016-07-15 14:17 被阅读56次
Blocks理解:

·Blocks可以访问局部变量,但是不能修改
如果修改局部变量,需要加__block

 __block int multiplier = 0;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//这样就可以了
         return num * multiplier;
     };

2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。如:

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
    NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
    [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
        [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
    }];
   
    NSLog(@"%@",mArrayCount);

**
例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。
**

####__weak不增加引用,__block增加引用

assign适用于基本数据类型,weak适用于NSObject对象且是一个弱引用
__block:使用__block修饰的变量可以在__block中被修改,且会被retain
__weak:使用__weak修饰的变量不会在block代码块中被retain 
同时,在ARC下,要避免block出现循环引用要用:
__weak __typeof(&*self)weakSelf =self; 等同于

__weak UIViewController *weakSelf =self;

为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

举例哦,某对象self,self的strong成员变量有blockA,blockA内部引用了self,如果self不经过__weak处理,就会变成:

    self强引用blockA,blockA强引用self。这不就循环引用了嘛

扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer

在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain

注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)

1、如果你通过引用来访问一个实例变量,self会被retain。
2、如果你通过值来访问一个实例变量,那么变量会被retain

相关文章

  • assign VS weak , __block 与 __wea

    Blocks理解: ·Blocks可以访问局部变量,但是不能修改如果修改局部变量,需要加__block 2、如果局...

  • assign VS weak ,__block vs __wea

    assign用于基础类型的赋值,不改变属性的引用计数,如:NSInteger,CGFloat,int float ...

  • 面试

    1. assign vs weak, __block vs __weak strong 和 weak 是在arc后...

  • iOS中的常用关键字

    strong copy weak assign __block __weak __unsafe_unretaine...

  • assign vs weak, __block vs __we

    assign vs weak assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引...

  • ARC strong和weak

    Block 避免循环引用 __weak typeof(self) weakSelf = self的含义 __wea...

  • 【iOS】keywords

    assign vs weak assign:简单赋值,用于基本数据类型,不会改变引用基数.weak: arc后引入...

  • Objective C - Assign, Copy, Reta

    Objective-C ARC: strong vs retain and weak vs assign 被无数人...

  • 内存优化方法

    检测内存问题的一般方法:1、静态检测方法;assign 与 weak,他们都是弱引用类型,最大的区别在哪呢?wea...

  • (iOS) Objective-C

    基础知识 nonatomic atomic strong copy weak & assign Block 进阶知...

网友评论

      本文标题:assign VS weak , __block 与 __wea

      本文链接:https://www.haomeiwen.com/subject/ktsyjttx.html