4

我最近转移到了 ARC,并且在将 self 对象传递给块时为它设置正确的属性值有点困惑。

据我了解,任何用_weak声明的属性都不应在 dealloc 方法中设置为 nil 传递给块的 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"];
}
4

2 回答 2

4

据我了解,任何声明的属性__weak都不应该设置为nil方法dealloc

是的,你绝对没有理由想要这样做。这不是一个问题,但它没有取得任何成果。

传递给块的 self 对象应该用__weakand not声明__block

是的,在 ARC 中,使用可以__weak降低保留周期(又名强参考周期)的风险。这在将块保存到某个变量时很重要,例如在您的示例中,或者如果块异步运行。请参阅《使用 Objective-C 编程指南》中的在捕获自我时避免强引用循环

请让我知道这种理解是否正确,并且我在以下实现中以正确的方式进行操作。

我在您的代码块中的唯一建议是您通常会看到一个weakSelf为此目的命名的变量,而不是aBlockSelf. 没什么大不了的,但它使代码更加不言自明。

于 2013-05-29T05:17:30.677 回答
0

你在做什么是正确的。

__weak MyViewController *aBlockSelf = self;

此外,在使用 ARC 时,您不应该覆盖dealloc,除非您创建并维护对 Core Foundation 对象的引用。当你覆盖dealloc时,不要打电话[super dealloc]

于 2013-05-29T04:48:28.197 回答