将self属性在传递给块时实现ARC

4

我最近转向使用ARC,对于在将self对象传递给block时设置正确的属性值有些困惑。

据我理解,任何用_weak声明的属性都不应该在dealloc方法中被设置为nil。而传递给block的self对象应该使用_weak声明,而不是__block

如果我的理解是正确的,并且我在下面的实现中做得正确,请让我知道。

(void)myApplication {
    self.data = [NSMutableDictionary dictionary];

    __weak MyViewController *aBlockSelf = self;

    [self.data setValue:[MyAction customActionWithBlock:^(MyAction *iAction, NSString *iIdentifier) {
    AnotherViewController *aController = [[AnotherViewController alloc] initWithType:@"aType"];
    aController.hasSearch = NO;
    aController.delegate = aBlockSelf;
        aController.showInventoryImage = YES;
    [aBlockSelf presentNavigationalModalViewController: aController];

    }] forKey:@"aKey"];
}
2个回答

4
在我的理解中,任何使用__weak声明的属性不应该在dealloc方法中设置为nil
完全没有理由这样做。这不会导致问题,但也没有任何实际作用。
将self对象传递给block时应该使用__weak而不是__block来声明。
是的,在 ARC 中使用__weak可以减轻保留循环(也称为强引用循环)的风险。当将块保存到某个变量中(就像您的示例中所示),或者块在异步运行时,这很重要。请参阅Objective-C 编程指南中的在捕获self时避免出现强引用循环
如果我的理解是正确的,并且下面的实现方式是正确的,请告诉我。
您代码块中唯一的建议是,通常情况下,您会看到一个名为weakSelf的变量,而不是aBlockSelf。这并不是大问题,但它使代码更加易于理解。

0

你所做的是正确的。

__weak MyViewController *aBlockSelf = self;

此外,在使用ARC时,除非您创建并维护对Core Foundation对象的引用,否则不应该覆盖dealloc。当您确实需要覆盖dealloc时,请勿调用[super dealloc]

我认为有很多理由可以重写dealloc方法! - CodaFi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接