Returning an autorelease'd CFTypeRef with ARC

Я новичок в автоматическом подсчете ссылок с 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.

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

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

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

9
задан Peter Hosey 22 October 2011 в 04:51
поделиться