2011-12-15 1 views
3

나는 ARC와 혼동스러워. CFUUIDRef를 만들 수 있으며 CFRetain 및 CFRelease를 통해 참조 횟수를 관리 할 수 ​​있습니다. NSArray에 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

확인. 배열에서 uuid가 제거 되어도 CFUUID가 여전히 사용되어야한다면'(__bridge_transfer id)'를 사용해서는 안된다는 뜻입니까? 그냥'(__bridge id)'를 사용해야합니까? – Yeung

0

배열에 CFUUIDRef를 추가하거나 제거 할 때 ARC가 처리하므로 특별한 작업을 수행 할 필요가 없습니다. 2011 WWDC 비디오에 액세스 할 수 있다면 "Objective-C Advancements in Dept"를 시청할 수 있습니다. 분 41:40부터는 ARC에 대한 CF Recipes에 대한 주제가 있습니다. __bridge를 사용할 때 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);