簡體   English   中英

可以在沒有__weak對象的塊中傳遞[self anyFunction](iOS 5 + ARC)

[英]Possible to pass [self anyFunction] in blocks without __weak object (iOS 5 + ARC)

是否有可能在沒有__weak對象的塊中傳遞[self anyFunction]?

作為示例,這是來自System Framework的有效代碼:

[UIView animateWithDuration:0.8 animations:^{
            //Do animationStuff
        } completion:^(BOOL finished) {
            [self anyFunction];
 }];

您可以在完成塊中傳遞[self anyFunction]而不會發出警告。 但是如果使用完成塊編寫自己的方法,則會出現以下警告: 在此塊中強烈捕獲“self”可能會導致保留周期

工作解決方案非常簡單(iOS 5 + ARC)。 在塊聲明之前:

__weak MyClass *weakSelf = self;

在完成塊中你必須打電話:

[weakSelf anyFunction];

但是,回到我的問題:為什么System Framework API中不需要使用__weak對象並且在沒有任何警告的情況下使用self 以及如何在塊中不需要__weak對象的情況下實現方法?

感謝你的付出。

拋出錯誤的塊是捕獲擁有塊的對象的塊。 例如

[object performBlock:^{
    [object performSomeAction]; // Will raise a warning
}];

要么

[self performBlock:^{
    [self doSomething];    // Will raise a warning
}];

[self performBlock:^{
    [object doSomething];    // <-- No problem here
}];   

因為一個對象保留了它的塊,一個塊保留了它的對象。 因此,在這兩種情況下,執行塊的對象擁有塊,該塊也擁有該對象。 所以你有一個循環 - 一個保留周期。 這意味着內存泄露。

在您給出的示例中 - 您正在查看類方法 您在UIView類上調用塊,而不是UIView對象。 類沒有與之關聯的內存。 你可能正在從一個控制器調用這個函數,所以塊保留了self引用,但是沒有循環,因為self沒有保留塊。

就像你可能注意到的那樣,並非所有在塊中使用的對象都需要被弱引用 - 只是導致保留周期的對象。

對於我需要使用或不使用ARC進行編譯的代碼,或者有或沒有更新的編譯器,我執行以下操作...功能上它與您已經列出的相同,但它避免了_weak並且也避免了保留釋放周期:

//
// FOR NON-ARC PROJECTS
//
__block __typeof__(self) bself = self;
[someObject doThingWithBlock:^(id result){
    if (!bself)
        return;
    bself.thingWhich = result;
}];

///
// FOR ARC PROJECTS
//
__weak MyClass *bself = self;
[someObject doThingWithBlock:^(id result){
    if (!bself) 
        return;
    bself.thingWhich = result;
}];

暫無
暫無

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

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