行return (__bridge DCSDictionaryRef)d;
给我一个"与本地变量相关联的堆栈内存地址已返回给调用者?"警告。理想情况下,我认为我应该创建一个DCSDictionaryRef
实例的新副本,但我对它的工作原理一无所知。如果有任何关于如何消除警告(以及潜在的泄漏或中途收集的对象)的提示/帮助,我将不胜感激。
第页。S.DCSCopyAvailableDictionaries
和DCSDictionaryGetShortName
是CoreFoundation中"未记录"的函数之一。
DCSDictionaryRef _DCSDictionary() {
NSArray *dicts = DCSCopyAvailableDictionaries();
for (NSObject *d in dicts) {
NSString *sn = DCSDictionaryGetShortName((__bridge DCSDictionaryRef)d);
NSLog(@"%@", sn);
if ([sn isEqualToString:@"Thesaurus"]) {
return (__bridge DCSDictionaryRef)d;
}
}
return NULL;
}
我认为您需要以下其中一个:
- DCSDictionaryRef
copy
函数 - DCSDictionaryRef的内存结构文档
- 非常令人印象深刻的黑客技能,允许您归档DCSDictionaryRef(及其指向的每个对象)并在另一个内存位置取消归档
以下是关于CoreFoundation内存管理的苹果文档。要点是您需要一个适用于您正在使用的数据类型的Copy
函数。查看是否可以定位并调用DCSDictionaryRef复制函数。链接文档中的示例是,一个名为CFStringCreateCopy
的函数将用于复制CFString对象。
我以前从未尝试过这样的方法,但可能会存档对象(假设你能够知道它的大小),但这也需要知道哪些位代表指针,然后存档指针指向的对象,这也需要了解这些对象的类型和大小。如果你能够成功地将其归档,那么你可能有机会在内存中的其他地方取消归档。
我觉得这是一个很深的兔子洞。