簡體   English   中英

我需要強壯自我來保持自我活力,強壯自我真的有效嗎?

[英]Do I need a strongSelf in block to keep self alive and does the strongSelf really work?

這就是我學到的:使用self保留塊時

  1. 我需要一個weakSelf打破保留周期
  2. 我需要一個strongSelf self ,以防止self在中途變成零

所以我想測試一個strongSelf是否真的可以使self保持活力,如下所示:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    self.test = @"test";
    NSLog(@"%@",self.test);
    __weak typeof(self)weakSelf = self;
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        __strong typeof(weakSelf)strongSelf = weakSelf;
        strongSelf.test = @"newTest";
        NSLog(@"%@",strongSelf.test);
    });
}

- (void)dealloc {
    NSLog(@"dealloc");
}

@end

ViewController將被推入navigationController並立即彈出。 輸出是

樣品

為什么為空?

還有一個問題,我有一個項目,其中包含大量不包含weakSelf strongSelf ,並且我收到大量11號崩潰的信號。 有關系嗎? 是否strongSelf為每個人都添加strongSelf

strongSelf確保如果尚未釋放self ,則不會在執行塊期間釋放它。

如果在創建strongSelf之前自我消失了,它將為零。

您應該檢查是否strongSelf確實包含以下內容:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    typeof(weakSelf)strongSelf = weakSelf; // __strong is not needed
    if(strongSelf){
        strongSelf.test = @"newTest";
        NSLog(@"%@",strongSelf.test);
    }
});

塊中的代碼在延遲3秒后執行。 因此,到這個時候,weakSelf已經為零。 這就是為什么StrongSelf為零

我認為您沒有正確解決問題。 使用弱勢將打破保留周期,但是此行:

__strong typeof(weakSelf)strongSelf = weakSelf;

在執行塊之前,不會捕獲對self的強引用。 因此,如果您指向該塊之外的VC的指針為nil,則在您擊中該塊時,VC將被釋放,weakSelf將為nil-這意味着您的strongSelf也將為nil。 捕獲強引用僅可確保如果您在塊的開始處具有較弱的自我,則直到結束時您都將擁有它,並且同時不會取消分配。 但是,如果在程序塊開始時weakSelf為零,則strongSelf也將為零。 而且,您不需要將其聲明為強內部塊,因為根據定義它將是強內部塊,因此可以將其替換為:

typeof(weakSelf)strongSelf = weakSelf;

要么

id strongSelf = weakSelf;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM