ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на маркировку файла -fno-objc-arc

85

ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на то, что помечен файл -fno-objc-arc? Почему это так?

У меня было предположение, что если вы отметите его -fno-objc-arc, у вас не будет этого ограничения.

Жолт
источник

Ответы:

170

Если вы получили это сообщение, попробуйте __unsafe_unrehibited. Это безопасно, только если объекты в структуре не сохраняются. Пример: если вы используете OpenFeint с ARC, класс OFBragDelegateStrings сообщает об этой ошибке в структуре.

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

к

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
Zeiteisen
источник
4
он также создает проблемы, когда я выделяю строку, в которой отображается предупреждение о назначении сохраненного объекта переменной unsafe_unreolated объект будет освобожден после назначения. И когда я его использую, вылетает
Дипак Сингх Неги
8
Это не решает всех проблем, объект обычно немедленно освобождается и становится недоступным.
Diziet
да - это на самом деле не работает ... решение состоит в том, чтобы каким-то образом отключить ARC для производного исходного файла, который я еще не смог выяснить ...
nielsbot
1
Вы делаете это, добавляя к файлу флаг -fno-objc-arc на этапе сборки.
Abizern
Что, если поле структуры - это всего лишь «тупая ссылка», а объект фактически сохраняется (принадлежит) где-то еще (скажем, внутри NSArray)? В этом случае он не будет немедленно освобожден, но мне интересно, что скажет компилятор (не могу его сейчас проверить) ...
Николас Миари
30

Вместо использования структуры вы можете создать класс Objective-C для управления данными.

Янош
источник
как? где образец?
Так почему бы не создать структуру для небольших вариантов использования?
Devanshu Saini
13

Это потому, что arc не может отслеживать объекты в структурах или объединениях (поскольку они в этой точке являются простыми указателями C).

Даже если вы отметили файл / класс, о котором идет речь, -fno-objc-arcвы все равно можете передать ему объект, управляемый arc, в качестве параметра, что, скорее всего, приведет к утечке памяти.

voidStern
источник
Но тогда как я могу использовать дуговые и не дуговые файлы в своих проектах. Например, я использую sharekit как non-arc, и я могу использовать экземпляры для публикации. Я использую файлы arc.
Zsolt
Вы можете использовать -fno-objc-arcдля смешивания файлов ARC и не ARC в проекте, но если вы используете простые структуры C, такие как struct или union, в любом месте, вы вообще не можете использовать ARC.
voidStern
Спасибо, voidStern .. "но если вы используете простые структуры C, такие как struct или union, вы вообще не можете использовать ARC." - Не думаю, что это правда. Я использую ARC для своих файлов. И без дуги для файлов libharu. Моя первоначальная проблема заключалась в том, чтобы передать значения отдельно в файл C и создать там структуру. Я думаю, что ключ кроется в переходе от дуги к недуговой к дуге.
Zsolt
1
Вообще могу немного преувеличить. По сути, вы не можете помещать указатели на объекты в структуры и объединения, что могло бы запутать ARC. Использование простой библиотеки C со структурами и / или объединениями должно (обычно) быть возможным.
voidStern
6

Похоже, теперь это работает без ошибок, возможно, после этого изменения .

т.е. вы можете поместить обычные (сильные) указатели на объекты Objective-C в структуру C. Он управляется ARC, например, он не сохраняется, когда структура разрушается. Проверено:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)

Хироши Итикава
источник
2
Что нового в LLVM - WWDC 2018
г-н Мин