【发布时间】:2012-09-27 18:26:31
【问题描述】:
这是一个有点棘手的场景。我一直在研究积木并第一次开始实施它们,我发现自己想要创建一个“复合积木”。这是我的代码,大致如下:
- (void)moveToPosition:(NSInteger)pos withVelocity:(CGFloat)vel onCompletion:(void(^)(BOOL completed))completionBlock
{
void (^compoundBlock) (BOOL completed) = ^(BOOL completed) {
[self unlockInteractionFromPullDownMenuTab];
void(^innerCompletionBlock)(BOOL completed) = completionBlock;
innerCompletionBlock(completed);
};
// Animate
[UIView animateWithDuration: duration
animations: ^void{ [self.pullDownMenu setFrame:newFrame]; }
completion: compoundBlock
];
}
目标是获取传递给此方法的代码块,向其中添加一些内容,然后将其传递给动画方法调用。但是,我的访问权限不好:
innerCompletionBlock(completed);
我认为我的 innerCompletionBlock 正在被释放,但我不完全确定原因。据我了解,blocks 会复制你扔给他们的所有东西,包括对 self 的引用——这会产生保留循环,而我最近学会了避免这种情况。
其实我最初是这样尝试的:
void (^compoundBlock) (BOOL completed) = ^(BOOL completed) {
[self unlockInteractionFromPullDownMenuTab];
completionBlock(completed);
};
但是我得到了错误的访问权限,我想也许复合块没有复制完成块,所以我在块内显式声明了一个(块)变量并分配它以尝试让它保留(也许是有点傻,但我在 ARC 下运行,所以我不能手动保留调用)。
无论如何,很明显,compoundBlock 在传递给 UIView 时会被保留,但我不确定如何在 CompoundBlock 中保留我的 onCompletion/innerCompletionBlock,因为我在 ARC 下运行。
提前致谢:)
【问题讨论】: