我收到一个错误,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/