Objective-C ARC阻止__strong __weak

时间:2015-12-06 15:57:26

标签: ios objective-c automatic-ref-counting block

使用ARC

TEST1:

@interface test01ViewController ()

@property (strong) void(^myBlock)(id obj, NSUInteger idx, BOOL stop);

@end

@implementation test01ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    self.navigationItem.title = @"test01";

    [self setMyBlock:^(id obj, NSUInteger idx, BOOL stop) {
        [self doSomethingWithObj:obj];
    }];
}

object(self)对块有明确的强引用。该块具有对strong的隐式self引用。那是一个循环,现在这两个对象都不会被正确释放。

所以test1 dealloc没有打电话。

TEST2:

@interface test03ViewController ()

@property (strong) void(^myBlock)(id obj, NSUInteger idx, BOOL stop);

@end

@implementation test03ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    self.navigationItem.title = @"test03";

    __weak test03ViewController *weakSelf = self;
    [self setMyBlock:^(id obj, NSUInteger idx, BOOL stop) {
        __strong test03ViewController *strongSelf = weakSelf;
        [strongSelf doSomethingWithObj:obj];
    }];
} 

__ weakSelf - > __strongSelf,我认为它与test1没有区别,但test2可以调用dealloc

为什么?

2 个答案:

答案 0 :(得分:2)

看一下这个答案:https://stackoverflow.com/a/28475562/543224

"无论如何,对于这种模式,捕获一个强引用,对于在块运行之前自我解除分配的情况没有做任何事情,这仍然可能发生。确保自己在执行块时不会被释放。如果块执行异步操作本身会给出一个窗口,那就很重要。"

答案 1 :(得分:0)

在第一种情况下,块捕获变量self,这是一个强引用(即它具有类型test01ViewController * __strong)。

在第二种情况下,块捕获变量weakSelf,这是一个弱引用(即它具有类型test03ViewController * __weak)。