繁体   English   中英

这是保留周期吗?

[英]Is this a retain cycle?

当我在自己保留的区块中对自己打电话时,我通常会收到警告:

[self.someView doSomething:^{
        self.aVar = @"Hello!";
    }];

我要做:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
    }];

但是如果我在weakSelf上调用一个方法,并且该方法使用self,那么即使我没有得到警告,这会导致保留周期吗? 我在说这个:

        __weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
        weakSelf.aVar = @"Hello!";
        [weakSelf aMethod];
    }];

和aMethod使用self

只要您的weakSelf 在块外声明 ,就没有保留周期。

使用块内的对象会隐式增加保留计数。 但是你要在weakSelf而不是self上调用aMethod ,所以保留计数不受影响。

您应该在块之外声明__weakself

__weak SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

否则编译器将保留self,因为它与块一起使用。

Beter甚至使用__block指令,因为__weak只是iOS 5及更高版本。

__block SomeObject *weakSelf = self;
[self.someView doSomething:^{
     weakSelf.aVar = @"Hello!";
     [weakSelf aMethod];
}];

关于调用self并导致retain的另一种方法,我从未见过这种行为。 我总是使用__block指令,它也可以捕获那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM