gpt4 book ai didi

objective-c - 转换到 NSString 后释放 CFStringRef

转载 作者:太空狗 更新时间:2023-10-30 03:49:41 25 4
gpt4 key购买 nike

我正在转换一个将 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 rulesFoundation 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com