2011-12-15 2 views
1

を使用して、ポインタの暗黙的な変換でエラーを取得することはARCで禁止されて私が「無効」にObjective-Cのポインタのエラー暗黙の変換を取得しています自動参照カウント問題

-(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です。

しかし、あなたの特定の質問に答えるには、contextパラメータはvoid *です。 ARCはvoid *ポインタの管理を維持できません(NSValue *)をこのメソッドに渡すと、ARCは事実上それを失います。

コンパイラはこれをブリッジキャストで許可します。しかし、あなたはまた、あなたの「contextPoint」は、このメソッドを超えて存続することを確認する必要がありますので、あなたが必要とする特定のキャストが+1ネットとキャストがある、__bridge_retainedされる保持カウント:当面の問題を解決し

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

あなたは今、そのcontextPointを漏らしていることを期待しています。

NSValue *contextPoint = (__bridge_transfer NSValue *)context; 

ARCの管理下にバックオブジェクトをこの橋や__bridge_transferリリースするARCを告げる:だからあなたanimationDidStart:context:またはanimationDidStop:finished:context:(あなたはこのcontextPointを使用することを意図した場所)であなたが+1このようなものでカウントがそのバランスする必要がありますそのオブジェクトは__bridge_retainedと以前のものとのバランスをとるためのものです。

また、代わりにブロックベースの方法を使用し、ARCとブロックでこれらの処理を行います。彼らは、アニメーションやコンプリートブロックで必要なオブジェクトを正しくキャプチャして保持する方法をすでに知っています。

私はそれが理にかなっていると思います。

+0

それは別のエラーを示します – Priya

+0

そして、そのエラーは何ですか?ここからあなたの画面が見えません。 ;) –

+0

宣言されていない識別子_bridge_retainedの使用。 – Priya

関連する問題