Как хранить объекты CFUUIDRef в NSArray с ARC? - PullRequest
3 голосов
/ 15 декабря 2011

Я запутался с ARC. Я могу создать CFUUIDRef и управлять счетчиком ссылок через CFRetain и CFRelease. Как мне добавить их в NSArray и передать ему право собственности?

CFUUIDRef *uuid = ...;

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

[arr removeObjectForKey:(__bridge id)uuid];

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

Является ли вышеуказанный правильный способ установки, удаления и получения? Если я удалю запись из этого массива, будет ли автоматически освобожден CFUUIDRef или мне придется извлекать каждый объект и CFRelease их сам?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Я согласен с ответом @Ken Wong, но, думаю, вам следует использовать (__bridge_transfer id), поскольку вы хотите передать владение CFUUIDRef массиву.Объект будет автоматически освобожден (но не обязательно освобожден) при удалении из массива или при освобождении массива.

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 голосов
/ 15 декабря 2011

Вам не нужно делать ничего особенного при добавлении или удалении CFUUIDRef в массив, так как ARC позаботится об этом.Если у вас есть доступ к видеороликам WWDC 2011 года, вы можете посмотреть «Улучшения Objective-C в отделе».Начиная с минуты 41:40, есть тема о рецептах CF для ARC.При использовании __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);
...