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

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

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


person Zsolt    schedule 11.11.2011    source источник


Ответы (4)


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

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

to

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
person zeiteisen    schedule 02.12.2011
comment
это также создает проблемы, когда я выделяю строку, которую он показывает, предупреждение о назначении сохраненного объекта для объекта переменной unsafe_unretained будет выпущено после назначения. И когда я использую, он вылетает - person Deepak Singh Negi; 14.06.2012
comment
Это не решает всех проблем, обычно объект немедленно освобождается и становится недоступным. - person Diziet; 17.09.2012
comment
да - на самом деле это не работает ... решение состоит в том, чтобы каким-то образом отключить ARC для производного исходного файла, что я еще не смог понять ... - person nielsbot; 26.03.2013
comment
Вы делаете это, добавляя флаг -fno-objc-arc в файл на этапе сборки. - person Abizern; 16.10.2013
comment
Что, если поле структуры — всего лишь немая ссылка, а объект на самом деле хранится (принадлежит) где-то еще (скажем, внутри NSArray)? В этом случае он не будет немедленно освобожден, но мне интересно, что скажет компилятор (не могу проверить прямо сейчас)... - person Nicolas Miari; 02.05.2014

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

person János    schedule 12.10.2013
comment
как? где образец? - person ; 08.03.2017
comment
Так почему бы не создать структуру для небольших вариантов использования? - person Devanshu Saini; 26.03.2018

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

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

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

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

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

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

person Hiroshi Ichikawa    schedule 10.10.2018
comment
Что нового в LLVM — WWDC 2018 - person Mr. Ming; 10.04.2019