2011-12-15 5 views
3

私はARCと混同しています。私はCFUUIDRefを作成することができ、CFRetainとCFReleaseを使って参照カウントを管理することができます。それらをNSArrayに追加して所有権を渡すにはどうすればよいですか?ARCを使用してNSArrayにCFUUIDRefオブジェクトを格納する方法は?

CFUUIDRef *uuid = ...; 

[arr setObject:myobj forKey:(__bridge id)uuid]; 

[arr removeObjectForKey:(__bridge id)uuid]; 

id myobj = [arr objectForKey:(__bridge id)uuid]; 

上記の設定、削除、検索の正しい方法はありますか?この配列からエントリを削除すると、CFUUIDRefが自動的に解放されるのですか、各オブジェクトを取得してCFを解放しますか?

+0

あなたは辞書ではなく、配列を扱っているようです。あなたは配列を議論することを意味しますか? –

答えて

2

私は@Kenウォンの答えに同意するが、私はあなたが配列にCFUUIDRefの所有権を譲渡したいので、あなたが(__bridge_transfer id)を使うべきだと思います。オブジェクトは、配列から削除されたとき、または配列の割り当てが解除されたときに自動的に解放されます(必ずしも割り当て解除されません)。

NSMutableArray *array = /* assume this exists */; 
CFUUIDRef uuid = /* assume this exists */; 
[array addObject: (__bridge_tranfer id) uuid]; 
NSLog(@"Before = %@", uuid); 
CFRelease(uuid); 

// The CFUUIDRef "lives on" in the array 
uuid = (__bridge CFUUIDRef) [array lastObject]; 
NSLog(@"After = %@", uuid); 

// The UUID is deallocated (`uuid` is now an invalid reference) 
[array release]; 
+0

OK。 uuidが配列から削除されても、CFUUIDをまだ使用する必要がある場合は、 '(__bridge_transfer id)'を使用しないでください。私は '(__bridge id)'を使うべきですか? – Yeung

0

ARUが処理するので、CFUUIDRefをアレイに追加または削除するときに特別な作業を行う必要はありません。 2011 WWDCビデオにアクセスすることができれば、「Objective-C Advancements in Dept」を見ることができます。分41:40から、ARCのCF Recipesについてのトピックがあります。 __ブリッジを使用しているときにCFメモリの管理は必要ありません。また、ARCは値を保持して解放することができます。

NSMutableArray *cfArray = [[NSMutableArray alloc] init]; 
CFUUIDRef uuid = CFUUIDCreate(NULL); 
[cfArray addObject:(__bridge id)uuid]; 
id myStr = [cfArray objectAtIndex:0]; 
NSLog(@"My UUID:%@", myStr); 
[cfArray removeObjectAtIndex:0]; 
NSLog(@"My UUID after remove from array:%@", myStr); 
CFRelease(uuid); 
関連する問題