簡體   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