Адрес стековой памяти, связанной с локальной переменной, возвращаемой вызывающей стороне? - PullRequest
3 голосов
/ 22 февраля 2012

Строка return (__bridge DCSDictionaryRef)d; дает мне «Адрес стековой памяти, связанной с локальной переменной, возвращаемой вызывающей стороне?»предупреждение.В идеале я думаю, что мне следует создать новую копию экземпляра DCSDictionaryRef, но я абсолютно не понимаю, как он работает.Буду признателен за любые подсказки / помощь о том, как мне избавиться от предупреждения (и потенциальной утечки или объекта, который будет выбран на полпути).

PS 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;
}

1 Ответ

1 голос
/ 22 февраля 2012

Я полагаю, вам нужно одно из следующих:

  • Функция DCSDictionaryRef copy
  • Документация для структуры памяти DCSDictionaryRef
  • Очень впечатляющие хакерские навыки, которые позволяют вам архивировать DCSDictionaryRef (и каждый объект, на который он указывает) и разархивировать его в другом месте памяти

Вот документация Apple по управлению памятью для CoreFoundation . Суть в том, что вам нужна функция Copy, применимая к типу данных, который вы используете. Посмотрите, сможете ли вы найти и вызвать функцию копирования DCSDictionaryRef. Пример в связанной документации состоит в том, что функция с именем CFStringCreateCopy будет использоваться для копирования объекта CFString.

Я никогда не пробовал что-то подобное раньше, но может быть возможно заархивировать объект (при условии, что вы можете знать его размер), но это также влечет за собой знание того, какие биты представляют указатели, и впоследствии архивирование объектов указателями указывают также, что также подразумевает знание типов и размеров этих объектов. Если вам удастся успешно заархивировать его, то вы можете попытаться разархивировать его в другом месте в памяти.

Мне кажется, это очень глубокая кроличья нора.

...