2011-12-15 37 views
1

的指针隐式转换一个错误,我得到一个Objective-C的指针为“无效”的错误隐式转换是不允许与ARC掌握使用自动引用计数问题

-(void)openAnimation { 

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

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

谁能帮我解决这个错误

谢谢

回答

4

因此,首先,我要指出的是,这种类型的东西是比较容易做的基于块的动画的方法。对于iOS4和iOS5,Apple recommends that you use those newer methods instead

但是要回答您的具体问题,上下文参数是一个void *。 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_retained。

再次,使用基于块的方法,让ARC和块为你照顾这些事情。他们已经知道如何正确捕获并保留动画或完成块中需要的对象。

我希望这是有道理的。

+0

它显示另一个错误 – Priya 2011-12-15 06:05:25