0

问题:我是否正确使用了这个块?没有泄漏或保留周期?

问题 1.5:这种风格好还是我应该只做一个内联块?

typedef void(^completionBlock)(void);

...

-(completionBlock)completionBlock{
    return ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:kFetchNewTopicsAndReloadTableData object:nil];
    };
}

..

-(void)refresh
{
    [self dismissViewControllerAnimated:YES completion:[self completionBlock]];
}
4

1 回答 1

1

该块不self通过引用实例变量来显式或隐式地引用 。所以它不会保留self. 表面上保留的只是元类NSNotificationCenter,我假设它是一个全局常量kFetchNewTopicsAndReloadTableData,不会导致其他任何东西被保留。

所以绝对没有保留周期,因为该块不处理任何瞬态对象。

即使它确实保留了self,也没有问题。与以下内容进行比较和对比:

@implementation SomeClass
{
    block_t someHandler;
}

...
    someHandler = [^{ [self doSomething]; } copy];

这将创建一个保留周期,因为该块随后被该块保留self并被self该块保留。您稍后可能会打破循环,但只使用弱引用而不是首先创建循环会更安全。

至于像你这样归还块是否是不好的形式:从技术上讲是的,因为你应该拥有copy它才能归还它。如果要在声明范围之外使用块,则应复制它们。如果它是内联的,则不需要复制它,因为那将是dismissViewControllerAnimated:.... 该块将侥幸逃脱,因为除了全局状态之外不捕获任何内容,但这也意味着副本基本上是免费的,因此不值得例外。

至于您更可能问的问题,可以说添加一个包装块声明的额外方法会使语法过于复杂,但如果您多次需要相同的块,则将适用正常的因式分解规则。

于 2013-10-31T02:44:14.950 回答