我最近转移到ARC,并且在将自身对象传递给块时设置正确的属性值时有点混乱。
根据我的理解,在
如果这种理解是正确的,请告诉我,我在下面的实施中正确地做到了这一点。
(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"];
}
答案 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]
。