2011-12-15 35 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