Работает ли дуга с основными объектами графика?
-
22-10-2019 - |
Вопрос
Недавно я запустил новый проект с использованием автоматического подсчета ссылок (ARC).
Когда я назначил содержимое каменного:
UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage
Я получил ошибку
Неявное преобразование типа указателя не объективного C 'CGIMAGEREF' в «ID» запрещено с помощью ARC
Просто кастинг CGImageRef
к id
скрывает ошибку, но мне было интересно, правильно ли он функционирует дуга?
Решение
Вы должны действительно посмотреть видео ARC с WWDC 2011. Они доступны на сайте разработчика и открываются через iTunes. Особенно:
• Сессия 323 - Внедрение автоматического отсчета справочника
• Сессия 322-Достижения Objective-C в глубине
Также ссылочные примечания ARC:
Как справочные заметки, так и видео обсуждают основную графику (и др.) И то, как они работают с ARC.
В частности, посмотрите на раздел под названием "Управление бесплатным мостом"
Во многих приложениях какао вам необходимо использовать основные объекты в стиле фундамента, будь то из самой основной структуры фундамента (например, CfarrayRef или CFMutabletictionaryRef) или из рамках, которые принимают основные конвенции, такие как основная графика (вы можете использовать такие типы Cgcolorspaceref и cggradientref )
Компилятор не автоматически управляет временем жизни основных объектов фундамента; Вы должны вызвать CFRETAIN и CFRELEASE (или соответствующие варианты, специфичные для типа) в соответствии с диктунными правилами управления памятью основного основания (см. Руководство по программированию управления памятью для Core Foundation).
Если вы разыгрываете объекты Objective-C и Core Foundation, вам необходимо рассказать компилятору о семантике владения объектом, используя либо актерский состав (определенный в objc/runtime.h) или основной макрос в стиле фундамента (определенный в Nsobject.h): [...
У Jörg Jacobsen также есть хороший краткий обзор вариантов моста: Управление бесплатным мостом в дуговой среде.
__bridge_retained (NB: Используйте его только при отлите от указателя объекта к указателю типа C): I (программист) должен ссылаться на этот объект в течение некоторого времени в темном мире указателей типа C, который является непрозрачным для вас, Arc. Так что, пожалуйста, не выпускайте этот объект, пока он мне все еще нужен. Я (программист) обещаю выпустить это сам (в темном мире), когда я закончил с этим
__bridge_transfer (NB: Используйте его только при отработке из указателя типа C к указателю объекта): я (программист) передаю вам, дугу, объекту, которым я владею, и который меня больше не интересуют в темном мире указателей типа C Это непрозрачно для вас. Всякий раз, когда вы, арку, делаются с этим объектом, пожалуйста, отпустите его самостоятельно, потому что вы знаете подходящее время и, таким образом, сохраняете мне некоторую работу, не необходимую для этого.
__мост: Arc, вы продолжаете уравновешивать свои сохраняющие и выпуски, когда я продолжаю уравновешивать свой в темном мире указателей типа C, который…. Всякий раз, когда мне нужно держаться за объект в темном мире, я сам сохраняю его и выпускаю его, когда это необходимо. Мне не нужен с вами никакого дополнительного контракта, Arc.
Другие советы
Несмотря на ссылки, указанные Стивом, я считаю, что случай, который вы показываете выше, может быть особенным. От Переход к примечаниям по выпуску дуги, обратите внимание на раздел «Компилятор обрабатывает объекты CF, возвращаемые из методов какао»:
Компилятор понимает методы Objective-C, которые возвращают основные типы фундамента, следуют историческим соглашениям о именовании какао (см. Руководство по программированию передового управления памятью). Например, компилятор знает, что в iOS CGCColor, возвращаемый методом CGCOLOR UICOLOR, не принадлежит.
Пример кода, который они предоставляют:
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
(id)[[UIColor lightGrayColor] CGColor], nil];
полагается на известное возвращение cgcolors из этих методов (им не хватает актерского состава, который я добавил в приведенном выше коде, который в ближайшее время должен быть исправлен в их документации).
Потому что [image CGImage]
Следует за соглашениями об именах, я полагаю, что CGIMAGE будет обоснован здесь. Я думаю, что ваш актерский состав TO ID должен быть всем, что вам нужно здесь.
Один популярный ответ на layer.contents = (id)image.CGImage
Вопрос layer.contents = obj_unretainedObject(image.CGImage)
.
Я делаю =(__bridge id)image.CGImage
.