【问题标题】:beginAnimations with "context"variable in ARC?ARC中带有“上下文”变量的开始动画?
【发布时间】:2023-10-23 16:35:02
【问题描述】:

问题与现有问题部分相似,但内存管理仍然出错。

以下非 ARC 代码有效:

[UIView beginAnimations:... context:[[NSNumber numberWithInt:i] retain]];

在 didStopSelector 中的某处:

NSNumber * n = (NSNumber *)context;
...
[n release];

我尝试删除保留/释放并添加副本(并结合这些方式)但没有效果。

另外我看到另一个类似的问题:

UIView Animation on multiple UIImageViews in ARC

他们将imageName 变量作为context 传递,但他们没有描述它是保留还是自动释放。

问题:

1)如何正确地将我的代码转换为 ARC?

2)如果您传递保留/自动释放的上下文(当然,如果自动释放通常可以工作),代码有什么不同吗?

【问题讨论】:

    标签: ios objective-c animation automatic-ref-counting bridge


    【解决方案1】:

    尝试__bridge_retained 保留对象并将其转换为void*

    void *context = (__bridge_retained void *)( @1000 );
    

    然后在animationDidStop 中,您必须使用__bridge_transfer 转移所有权。此时 ARC 应该自然地释放当前自动释放池中的对象。

    - (void)animationDidStop:(void *)context {
       NSNumber *n = (__bridge_transfer id)context;
    }
    

    您也可以直接切换到基于块的 API 和参考视图。

    【讨论】:

    • 好的,那么__bridge 和类似的呢?
    • @VyachaslavGerchicov 当然我原来的答案是不正确的。我更新了答案。你能测试一下它是否可以编译吗?