- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在转换一个将 CFStringRef 转换为 NSString 的 Objective-C 函数,就像这样(其中 FSEventStreamCopyDescription 返回一个 CFStringRef):
return (NSString *)FSEventStreamCopyDescription(eventStream);
但是,在分析我的应用程序后,我被告知由于缺少 CFRelease 调用,这将导致“潜在泄漏”。我正在尝试重写此函数以避免任何泄漏。处理这个问题的正确方法是什么?我提供了两种可能性(都可能不正确):
选项 A:
CFStringRef ref = FSEventStreamCopyDescription(eventStream);
NSString *desc = [(NSString *)ref copy];
CFRelease(ref);
return [desc autorelease];
选项 B:
CFStringRef ref = FSEventStreamCopyDescription(eventStream);
NSString *desc = [[NSString alloc] initWithString:(NSString *)ref];
CFRelease(ref);
return [desc autorelease];
最佳答案
转换不会对对象做任何事情。强制转换仅告诉编译器“这实际上是一个 _____
”。
它也不会对内存管理规则做任何事情。您仍然有一个对象,该对象是从遵循 CF 规则并在其名称中包含 Copy 的函数中获得的。因此,您拥有该对象;因此,您有责任发布它。
重要的不是类的名称;免费桥接意味着 CFString 是 NSString。重要的是你从中获得对象的函数或方法的规则是什么( CF rules 或 Foundation rules ),以及你是否遵守它们。
选项 A 和 B 都解决了问题,但过于复杂。
选项A中的复制和发布没有任何效果。你已经复制了它;制作另一个副本不会改变这种情况。这只会浪费您和用户的时间。
选项B的initWithString:
(或stringWithString:
)同样没有任何效果。你已经有了一个 CFString,一个 CFString 就是一个 NSString,所以你不需要创建一个 NSString。最终,这等同于选项 A。
@kubi 的回答是迄今为止最好的,但有一个改进:
return [NSMakeCollectable(FSEventStreamCopyDescription(eventStream)) autorelease];
通过此更改,代码将在垃圾回收下正常工作,其中 autorelease
不执行任何操作。同时,在保留/释放规则下,NSMakeCollectable
什么都不做。无论哪种方式,您的所有权都将在适当的时候被释放/收回。
关于objective-c - 转换到 NSString 后释放 CFStringRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952052/
我想了解从 ARC 中的 CFStringRef 获取 NSString 的正确方法?反方向也一样,ARC中的CFStringRef到NSString? 在不造成内存泄漏的情况下,正确的方法是什么?
我有一个 CFStringRef 变量,我执行检查以确保它不是 1 特定值。如果是,那么我想将其设置为 @""的 NSString 等效项 这是代码 CFStringRef data = = CFDi
我有一个应用程序可以获取用户地址簿中的名字和姓氏。我已经在模拟器和我自己的运行 iOS 7 和 XCode 5 的 iPhone 4S 上进行了测试,它运行良好。 最近,一些国际用户一直在提示我的应用
我想定义一些常量并考虑使用 #define 结构,如下所示: #define kUpdateTeamNotification CFSTR("kUpdateTeamNotification") 我的问题
我只是尝试播放苹果的 HLS 样本流。我的代码很简单: - (IBAction)playHLS:(id)sender { NSString* str = @"https://devima
我正在尝试跟踪程序中的内存使用情况,我需要知道用于字符串数据数组的总内存。 我的字符串表示为 CFStringRef,我的数组是 CFMutableArrayRef。 在字符串上,我可以调用 CFSt
能否请您告诉我在非 ARC 世界中哪种方法是正确的以及为什么。 + (NSString *)getUUID { CFUUIDRef theUUID = CFUUIDCreate(NULL); CFSt
我正在使用 CFDictionaryGetValue 从 CFDictionaryRef 中获取 CFStringRef。 我一直在尝试使用 CFStringGetCString 或 CFString
我有一个 wchar_t *,我需要在需要 CFStringref 的函数上使用它 我尝试使用 CFStringCreateWithCharacters 但我没有得到任何结果。 所以,如果我有: wc
NSString *aNSString; CFStringRef aCFString; aCFString = CFStringCreateWithCString(NULL, [aNSString U
我有一个 DTrace 探针捕获对函数的调用,该函数的参数之一是 CFStringRef。这是保存指向 unicode 字符串的指针的私有(private)结构。但 CFStringRef 本身并不是
我有以下代码片段: -(CFStringRef)setupFileName:(NSString*)_name :(NSString*)_extension { NSString* tmpName =
我正在尝试实现 CFDictionaryGetValue(),如 this appledoc 中所示 list 3: server = CFDictionaryGetValue(credentialD
我正在尝试从主包中检索一些信息: - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { CFSt
我的文件中有以下代码 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"images" ofType:@"plist"];
我正在转换一个将 CFStringRef 转换为 NSString 的 Objective-C 函数,就像这样(其中 FSEventStreamCopyDescription 返回一个 CFStrin
import Foundation import MobileCoreServices func checkFileExtension(fileName: NSString){ println
我一直在寻找从 CFStringRef 出发的正确方法至NSString在 ARC 中避免内存泄漏,一些主要投票的答案建议: NSString * string = (__bridge NSStrin
我在代码中调用以下方法: NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myappname" withExtension:@"mo
如果是很基础的问题请多多包涵。我尝试使用 __bridge 将 CFStringRef 转换为 NSString,因为我启用了 ARC。 mydevUUIDString = CFUUIDCreateS
我是一名优秀的程序员,十分优秀!