如何在ARC下创建一个不泄漏的CFUUID NSString?

Tig*_*ing 7 iphone objective-c ios automatic-ref-counting

关于CFUUID的SO有几个很好的例子,特别是这个:

如何使用iPhone SDK创建GUID/UUID

但它是为ARC之前的代码而制作的,而且我还不是CF迷(还),那么有人可以提供适用于ARC的示例代码吗?

+ (NSString *)GetUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  return [(NSString *)string autorelease];
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*ell 23

你想要一个"桥接转移":

+ (NSString *)GetUUID
{
  CFUUIDRef theUUID = CFUUIDCreate(NULL);
  CFStringRef string = CFUUIDCreateString(NULL, theUUID);
  CFRelease(theUUID);
  return (__bridge_transfer NSString *)string;
}
Run Code Online (Sandbox Code Playgroud)

过渡到导弧

__bridge_transfer或者CFBridgingRelease()将非Objective-C指针移动到Objective-C,并将所有权转移到ARC.

但是!您还应该重命名您的方法.ARC使用方法名称约定来推断保留计数,并且get以Cocoa 开头的方法具有特定含义,包括传入缓冲区以使其填充数据.一个更好的名称将是buildUUID或描述UUID使用的另一个词:pizzaUUIDbearUUID.


Ben*_*tto 5

假设您此时不再需要支持6.0之前的iOS,您可以跳过所有Core Foundation UUID的内容,只需执行以下操作即可获得新的内容:

NSString * uuidStr = [[NSUUID UUID] UUIDString];
Run Code Online (Sandbox Code Playgroud)