objective-c - 我是否应该在对象指针上使用 __block 说明符,即使它在没有它的情况下也能工作?

标签 objective-c macos variables block

我正在使用 CAAnimation 完成 block (使用 CAAnimationBlocks )在动画结束时提供处理,并且该完成 block 的一部分修改动画 CALayer。即使 layer 没有使用 __block 说明符声明,这仍然有效,因为对象指针保持不变,但我实际上将对象视为读/写。

Apple Guide 的一个方面困扰我的是:

__block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope.

鉴于 layer 是一个集合迭代器,在我看来,如果我使用 __block 说明符,它实际上会中断。

这里是有问题的代码:

for (CALayer *layer in _myLayers)   // _myLayers is an ivar of the containing object
{
    CAAnimationGroup *group = ...;
    ...
    group.completion = ^(BOOL finished)
    {
        [CATransaction begin];
        [CATransaction setValue:(id)kCFBooleanTrue
                         forKey:kCATransactionDisableActions];
        layer.position = [self _findPosition];
        [CATransaction commit];

        [layer removeAnimationForKey:@"teleportEffect"];
    };

    [layer addAnimation:group forKey:@"teleportEffect"];
}

我的实际问题是:我这样做是否正确(我的蜘蛛感觉很刺痛)。

编辑 我还应该补充一点,我的应用程序使用 MRR,但是保留/释放没有问题,因为这些层本质上是静态(它们的生命周期是包含 NSView)。此外,我似乎正在做 guide要避免的模式部分。说我不应该这样做,尽管(我)不清楚为什么。

最佳答案

__block 变量在 block (和封闭范围)内是可变的,并且如果任何引用 block 被复制到堆中则被保留。

我认为在您的情况下您不需要 block 变量,因为您正在更改 block 内对象 layer 的值,因为它属于 _myLayers 似乎是一个实例变量的数组很难在每个 block 执行之前释放对象......但是你可以添加 __block 存储类型修饰符来保留对象,但是 如果您使用的是 ARC,对象变量会在 block 被复制和稍后释放时自动保留和释放

关于objective-c - 我是否应该在对象指针上使用 __block 说明符,即使它在没有它的情况下也能工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12445475/

相关文章:

java - 检查两个整数输入是否在范围内-Java

ios - 不同设备屏幕尺寸

ios - 如何使用 NSUserDefault 将选定的 TableViewCell 文本发送到之前的 ViewController

objective-c - 在 Objective-C 中,将 block 中的弱点分配给强点是什么意思?

python - Bash:WAITING后台python进程

javascript - 有没有办法创建变量的名称并从循环中进行更改?

ios - 带有解析查询的 UITableView 未加载

java - 用于 DMG 背景的自定义插入式图标,用于 MacOSX 上的应用程序打包

iphone - iOS 开发人员在全新安装 Lion 之前应该备份哪些内容?

c - 无明显原因增加++ 值的无符号整型变量