Возвращая autorelease бы CFTypeRef с дугой


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

Вот что я скажу: можно было бы сделать с ARC disabled:

- (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), чтобы возвратить autorelease бы изображения.

2 9

2 ответа:

Обновление

Начиная с OS X 10.9 и iOS 7.0, public SDK включает функцию CFAutorelease.

Оригинал

Можно создать такую функцию полезности:

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

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

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

UIImage *image;
image.CGImage

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