objective-c - 使用自动引用计数问题隐式转换指针时出错

标签 objective-c ios cocoa-touch automatic-ref-counting

我收到一个错误,ARC不允许将Objective-C指针隐式转换为“void”

-(void)openAnimation {

     NSValue *contextPoint =[NSValue valueWithCGPoint:self.view.center];

    [UIView beginAnimation:nil context:contextPoint]; // getting error here
}

谁能帮我解决这个错误

谢谢

最佳答案

因此,首先,我要指出的是,使用基于块的动画方法更容易进行此类操作。对于iOS4和iOS5,请使用Apple recommends that you use those newer methods instead

但是要回答您的特定问题,context参数为空*。 ARC不(无法)对void *指针进行任何管理,因此,当您将“contextPoint”(即NSValue *)传递给此方法时,ARC实际上会失去对它的跟踪。

编译器将允许使用桥强制转换。但您还必须确保您的'contextPoint'可以在此方法之外生存,因此您需要的特定强制转换是__bridge_retained,这是具有+1净保留计数的强制转换:

[UIView beginAnimation:nil context:(__bridge_retained void *)contextPoint];

这就解决了眼前的问题,希望您现在可以泄漏该contextPoint。因此,在您的animationDidStart:context:animationDidStop:finished:context:(无论您打算使用此contextPoint的何处)中,您需要平衡+1计数与以下内容:
NSValue *contextPoint = (__bridge_transfer NSValue *)context;

这会将对象桥接回到ARC的控制之下,并且__bridge_transfer告诉ARC释放该对象以平衡先前保留的__bridge_retain。

同样,请改用基于块的方法,然后让ARC和块为您处理这些事情。他们已经知道如何正确捕获和保留动画或完成块中所需的对象。

我希望这是有道理的。

关于objective-c - 使用自动引用计数问题隐式转换指针时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8515475/

相关文章:

ios - "insetGrouped"样式中单元格预览的圆角 (iOS 13)

mysql - 计算两个纬度/经度点之间的距离不一致

ios - 从 AVFullScreenViewController iOS 8 获取媒体链接

objective-c - ScrollRectToVisible 函数

objective-c - isMemberOfClass 与比较类 ==

ios - 如何停止使用 SpriteKit 和 Swift 播放音效?

objective-c - 从核心数据实体中获取特定记录

ios - 主页按钮可将应用程序最小化

objective-c - 绘制矩形时如何避免颜色混合?

ios - 为什么 iOS7 中的 bottomLayoutGuide 和 automaticallyAdjustsScrollViewInsets 没有考虑 UIToolBar 的高度(使用自动布局)