这是一个有点棘手的场景。我一直在研究积木并第一次开始实施它们,我发现自己想创建一个“复合积木”。这是我的代码,大致如下:
- (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 正在被释放,但我不完全确定为什么。据我了解,块会复制你扔给它们的所有内容,包括对自我的引用——这会产生保留循环,而我最近学会了避免这种情况。
实际上,我最初尝试过这个:
void (^compoundBlock) (BOOL completed) = ^(BOOL completed) {
[self unlockInteractionFromPullDownMenuTab];
completionBlock(completed);
};
但是我得到了错误的访问,我想也许compoundBlock没有复制completionBlock,所以我在块内显式声明了一个(块)变量并分配它以试图让它保留(也许有点傻,但我在 ARC 下运行,所以我不能手动保留调用)。
无论如何,很明显,compoundBlock 在传递给 UIView 时会被保留,但我不确定如何在 CompoundBlock 中保留我的 onCompletion/innerCompletionBlock,因为我在 ARC 下运行。
提前致谢 :)