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

时间:2012-02-22 08:42:14

标签: objective-c cocoa automatic-ref-counting

这条线 return (__bridge DCSDictionaryRef)d; 给我一个“与本地变量关联的堆栈内存的地址重定为调用者?”警告。理想情况下,我认为我应该创建DCSDictionaryRef实例的新副本,但我对它是如何工作绝对无能为力。 非常感谢任何提示/帮助我如何摆脱警告(以及潜在的泄漏或中途收集的物体)。

P.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;
}

1 个答案:

答案 0 :(得分:1)

我相信您需要以下其中一项:

  • DCSDictionaryRef copy函数
  • DCSDictionaryRef的内存结构文档
  • 非常令人印象深刻的黑客技能,允许您存档DCSDictionaryRef(及其指向的每个对象)并在另一个内存位置取消归档

这是Apple documentation about memory management for CoreFoundation。要点是,您需要一个适用于您正在使用的数据类型的Copy函数。看看您是否可以找到并调用DCSDictionaryRef复制功能。链接文档中的示例是名为CFStringCreateCopy的函数将用于复制CFString对象。

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

我认为这是一个非常深的兔子洞。