Сохранение и «автоматическое освобождение» в Core Foundation - PullRequest
2 голосов
/ 25 декабря 2011

Допустим, я пишу свою собственную функцию, которая принимает объект CFDataRef, что-то с ним делает и возвращает другой объект CFDataRef:

CFDataRef transformData(CFDataRef inData)
{
  //Question 1: Should I call CFRetain(data) here to make sure it doesn't
  //go away? (This of course would involve releasing data just before returning
  //from this function, or as soon as I no longer need data.)

  CFDataRef outData;

  //Somehow produce the new outData from inData (and assume we are the
  //owner of outData, since we created it right here).

  //Question 2: What, if anything, should I do with outData before
  //returning it? I'm unsure of this, because CF doesn't have any
  //autoreleasing mechanism.

  return outData;
}

Как видите, у меня есть два вопроса, и они содержатся прямо в коде выше.

1 Ответ

7 голосов
/ 25 декабря 2011

Для вопроса 1: единственная причина, чтобы сохранить его наверху и выпустить его позже, была бы безопасностью потока, в случае, когда вас вызывают из одного потока, а другой поток освобождает последнее владение данными, но это выигралоне поможет: даже если вы сохраните объект, освобождение может произойти до этого или даже до вашего вызова, и в этом случае проблема все еще возникает, и вы только сделали ее реже.Поэтому я говорю, не беспокойтесь об этом.

Для вопроса 2: переименуйте вашу функцию в CreateDataByTransformingData.Затем в соответствии с правилами управления памятью CF правила ваша функция возвращает владение, которое должен освободить вызывающий объект.

Альтернативное решение вопроса 2: приведите к NSData * и отправьте ему autorelease сообщение.(Для этого требуется, чтобы вы использовали MRC, а не ARC, по крайней мере, для этого модуля / класса.)

[Добавлено 2013-11-01] Альтернативное альтернативное решение: Требуйте OS X 10.9 или более поздней версии и используйте theновая CFAutorelease функция .

...