3

プロジェクトをARCに変換しようとしています。このプロジェクトには、無指向性の有向グラフがあり、基本的にはどこにでも二重間接ポインタがたくさんあります。プロジェクトを二重間接指定のARCに変換するポインタ割り当て

これはARCに変換するのが非常に難しいことを証明しています。特に、現在のところ私は困っています。

ここにシナリオがあります。

のは、あなたが持っているとしましょうNSString *

NSString *b = [[NSString alloc] initWithString:@"hello"]; 

あなたはまた、二重間接のタイプがあります:あなたは、次のように一方を他方に割り当てる

__unsafe_unretained NSString **a; 

を:

a = &b; 

これは変換エラーを返します:

error: assigning 'NSString *__strong *' to 'NSString *__unsafe_unretained *' changes retain/release properties of pointer 

bから__unsafe_unretainedに変更することはできません。私はまた、様々なブリッジキャストを試みました。私はここで何かを見逃していますか?

アイデア?

ありがとうございます!

答えて

5

あなたは、メモリ管理の問題を回避するためにへのポインタのconstポインタを使用することができます。

__attribute__((objc_precise_lifetime)) NSString *b = [[NSString alloc] initWithString:@"hello"]; 
NSString *const*a; 
a = &b; 

あなたは全体の文脈のためにbを利用できるようにobjc_precise_lifetimeを使用する必要があります(ARCは、最後の参照の後にbを解放することができます)

EDIT:これはまた、使用(ただし、あなたのダブルポインタを管理するのに注意してください)

NSString *b = [[NSString alloc] initWithString:@"hello"]; 
NSString *__strong*a; 
a = &b; 
+0

することができますは、constのQずにそれを行うための方法がありますualifier? * aに値を割り当てる必要がありますか? –

+1

NSString * b = [[NSString alloc] initWithString:@ "hello"]; NSString * __ strong * a; a =&b; –

+1

しかし、私はこれが良い理由だとは思わない。なぜなら、ARCはポインタへのポインタを「メモリ管理」しないからである(これがデフォルトの* __自動解放*である理由)。 –

関連する問題