weakSelf GCD

dispatch_async(dispatch_get_main_queue(), ^{安全

[weakSelf updateView4SwiperSuccess:result];async

});
上面这段代码,在 ARC有问题可是不会引发,由于weakSelf 释放后会被置为nil,OC语法向一个空的对象发送消息是不会崩溃的,虽然不会崩溃,可是原有逻辑却走不了了。
在MRC下会出现野指针的状况,即执行到block的时候,weakself 引用的self 已经释放,而self 属性是unsafe_unretained。因此这段block是不安全的。
那么上面这段代码如何正确的使用呢?函数

dispatch_async(dispatch_get_main_queue(), ^{spa

[self updateView4SwiperSuccess:result];指针

});
对你没看错,就是这样使用,里面不须要使用weakSelf。
block 引用self, self 引用计数+1,当block 执行完毕释放时候self 引用计数减1,伪代码以下code

dispatch_async(dispatch_get_main_queue(), ^{对象

//_Block_object_assingn(&self); self  retain
    [self updateView4SwiperSuccess:result];
    //_Block_object_dispose(&self); self release

});

咱们要清楚的知道何时使用weakself,weakself是在有循环引用的状况下使用的。即 a引用b,b也引用a。而GCD block里面只引用了self ,self并无引用gcd 的block因此不须要用weakself。 下面示例的代码也同样。ip

NSObject *testObject = [[NSObject alloc] init];get

testObject.testBlock = ^(){
    [self doSomeThing];
};
[testObject release];

上面这段代码也不须要用weakself,很简单 [testObject release];执行后 testObject 进度dealloc函数 释放它的成员变量,包括testblock,testblock释放调用函数_Block_object_dispose()释放外部变量。因此不会循环引用,可是若是上面代码写成这样就会出现循环引用了it

-(void)test

self.testObject = [[NSObject alloc] init];
   self.testObject.testBlock = ^(){
            [self doSomeThing];
        };

}

  • (void)dealloc
    {

    self.testObject  = nil;

    }

上面这段函数就出现了循环引用,self,等待testobject释放,而testobject也在等待self释放,这样就形成了循环引用。对于上面这段代码循环引用的原理我就不详细解释了。(转)

相关文章
相关标签/搜索