Возвращая 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 ответа:
Обновление
Начиная с 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
в поле всплывающее окно.