与返回给调用方的本地变量关联的堆栈内存的地址



return (__bridge DCSDictionaryRef)d;给我一个"与本地变量相关联的堆栈内存地址已返回给调用者?"警告。理想情况下,我认为我应该创建一个DCSDictionaryRef实例的新副本,但我对它的工作原理一无所知。如果有任何关于如何消除警告(以及潜在的泄漏或中途收集的对象)的提示/帮助,我将不胜感激。

第页。S.DCSCopyAvailableDictionariesDCSDictionaryGetShortName是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对象。

我以前从未尝试过这样的方法,但可能会存档对象(假设你能够知道它的大小),但这也需要知道哪些位代表指针,然后存档指针指向的对象,这也需要了解这些对象的类型和大小。如果你能够成功地将其归档,那么你可能有机会在内存中的其他地方取消归档。

我觉得这是一个很深的兔子洞。

最新更新