Возврат autoRlease'd CFTypeRef с ARC - PullRequest
9 голосов
/ 22 октября 2011

Я новичок в Автоматическом подсчете ссылок с LLVM и Objective-C, и у меня есть вопрос о возврате CGImageRefs из моей функции Objective-C. В дни ручного подсчета ссылок можно было просто привести CGImageRef к id, автоматически выпустить его, а затем вернуть исходный CGImageRef. С ARC я знаю, что вы можете направить систему ARC на автоматическое освобождение и вернуть свой сохраняемый объект, но я не вижу способа сделать это для CFTypeRefs.

Вот что я могу сделать с отключенной ARC:

- (CGImageRef)image {
    CGImageRef myImage;
    id myImageID = (id)myImage;
    [myImageID autorelease];
    return myImage;
}

Итак, я хочу создать метод, который с помощью ARC возвращает CGImageRef, который не принадлежит вызывающей стороне. Если есть лучший способ сделать то же самое, я открыт всем идеям. Я знаю, что UIImage делает что-то подобное со свойством CGImage.

Редактировать: Хотя отключение ARC для определенного файла является допустимым способом сделать это, я бы предпочел использовать чистый ARC во всем коде. Это удобно, когда вы делитесь определенным кодом для определенных файлов с другими, так как им не нужно изменять настройки сборки для любого конкретного файла. Чтобы использовать систему ARC для автоматического выпуска CFTypeRef, вы можете сделать это:

__attribute__((ns_returns_autoreleased))
id CGImageReturnAutoreleased (CGImageRef original) {
    // CGImageRetain(original);
    return (__bridge id)original;
}

А затем просто сделайте return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage), чтобы вернуть изображение с автоматическим выпуском.

Ответы [ 2 ]

3 голосов
/ 22 октября 2011

ОБНОВЛЕНИЕ

Начиная с OS X 10.9 и iOS 7.0, общедоступный SDK включает в себя функцию CFAutorelease.

ORIGINAL

Вы можете создать такую ​​служебную функцию, как эта:

void cfAutorelease(CFTypeRef *ref) {
    [[(id)ref retain] autorelease];
}

и поместите его в файл, который вы компилируете с отключенным ARC.Вам нужно передать флаг компилятора -fno-objc-arc, чтобы отключить ARC для этого файла.В Xcode 4 выберите ваш проект, затем вкладку Build Phases.Откройте раздел «Скомпилировать источники».Дважды щелкните файл, содержащий служебную функцию, и введите -fno-objc-arc во всплывающем окне.

0 голосов
/ 30 сентября 2013

Если вы используете ARC, не беспокойтесь о autoreleasing объекте,

UIImage *image;
image.CGImage

всегда возвращает сам autorelease объект.

...