ARC实现自身属性,同时将其传递给阻止

时间:2013-05-29 00:36:09

标签: objective-c xcode macos cocoa-touch automatic-ref-counting

我最近转移到ARC,并且在将自身对象传递给块时设置正确的属性值时有点混乱。

根据我的理解,在

方法中不应将使用 _ weak 声明的任何属性设置为nil。传递给块的自身对象应使用 _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 个答案:

答案 0 :(得分:4)

  

根据我的理解,使用__weak声明的任何属性都不应在nil方法中设置为dealloc

是的,你绝对没有理由想要这样做。这不是问题,但它什么都没有。

  

传递给块的自身对象应该使用__weak而不是__block声明。

是的,在ARC中,使用__weak可以降低保留周期的风险(a.k.a.强参考周期)。将块保存到某个变量(如示例中)或者块异步运行时,这很重要。请参阅使用Objective-C编程指南中的Avoid Strong Reference Cycles when Capturing self

  

如果这种理解是正确的,请告诉我,我在下面的实施中正确地做到了这一点。

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

答案 1 :(得分:0)

你在做什么是正确的。

__weak MyViewController *aBlockSelf = self;

此外,使用ARC时,除非您创建并维护对Core Foundation对象的引用,否则不应覆盖dealloc。如果您覆盖dealloc,请不要致电[super dealloc]