Почему у меня есть потенциальная утечка в CFURLCreateStringByAddingPercentEscapes? - PullRequest
1 голос
/ 14 июля 2011

Мой код:

NSString *buffer = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)name, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);

NSString *totalString = [NSString stringWithFormat:@"buffer/%@", buffer];

Я запустил «инструмент построения и анализа» и увидел: «Объект, размещенный в строке 979 и сохраненный в« буфере », больше не ссылается после этой точки и имеет сохранениеколичество +1 (объект просочился) ".

Почему у меня потенциально есть утечка в CFURLCreateStringByAddingPercentEscapes?

Ответы [ 5 ]

5 голосов
/ 10 августа 2012

В ARC вы должны передать управление памятью возвращаемого значения, используя __bridge_transfer:

    NSString *buffer = (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)name, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
1 голос
/ 14 июля 2011

Это из-за «правила создания»:

Основные функции Foundation имеют имена, которые указывают, когда у вас есть возвращаемый объект:

  • Функции создания объектов, для которых встроено имя «Создать»;
  • Функции дублирования объектов, в которые встроено «Копирование».

Если вы владеете объектом, вы обязаны отказаться от права собственности (используя CFRelease), когда закончите с ним.

1 голос
/ 14 июля 2011

Если вы посмотрите на this, вы увидите, что вы выделяете, так как метод содержит Create, но не отказывается от владения строкой.

Выпустите чтоВы владеете и владеете buffer.Добавьте

[buffer release];

после получения totalString.

0 голосов
/ 14 июля 2011

CFURLCreateStringByddingPercentEscapes создает строку с числом ссылок +1, поэтому вам нужно освободить буфер (или авто-релиз), чтобы не пропускать его ..

0 голосов
/ 14 июля 2011

Что может случиться, если анализатор выдаст вам ошибку в строке, в вашем случае 979, но объект, на который он ссылается, фактически находится над ним

Не видя ваш код, я не могу быть уверен, но прочиталдо нескольких строк и может увидеть, откуда на самом деле происходит ошибка, а XCode видит только утечку, где она используется

...