通过使用自动引用计数问题隐式转换指针来获取错误

我得到一个错误一个Objective-C指针隐式转换为'无效'与ARC是不允许的

-(void)openAnimation { NSValue *contextPoint =[NSValue valueWithCGPoint:self.view.center]; [UIView beginAnimation:nil context:contextPoint]; // getting error here } 

任何人都可以帮我解决这个错误

谢谢

所以首先我要指出的是,这种types的事情对于基于块的animation方法来说更容易。 对于iOS4和iOS5, Applebuild议您改用这些较新的方法 。

但是要回答你的具体问题,上下文参数是一个void *。 ARC没有(不能)维持对void *指针的任何pipe理,所以当你将“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_retained。

再次使用基于块的方法,让ARC和块为你处理这些事情。 他们已经知道如何在animation或完成块中正确捕捉和保留所需的对象。

我希望这是有道理的。