Вопрос

Недавно я запустил новый проект с использованием автоматического подсчета ссылок (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:

https://developer.apple.com/library/content/releaseNotes/objectivec/rn-transitioningtoarc/introduction/introduction.html

Как справочные заметки, так и видео обсуждают основную графику (и др.) И то, как они работают с 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top