ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на то, что помечен файл -fno-objc-arc? Почему это так?
У меня было предположение, что если вы отметите его -fno-objc-arc, у вас не будет этого ограничения.
ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на то, что помечен файл -fno-objc-arc? Почему это так?
У меня было предположение, что если вы отметите его -fno-objc-arc, у вас не будет этого ограничения.
Если вы получили это сообщение, попробуйте __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;
NSArray
)? В этом случае он не будет немедленно освобожден, но мне интересно, что скажет компилятор (не могу его сейчас проверить) ...Вместо использования структуры вы можете создать класс Objective-C для управления данными.
источник
Это потому, что arc не может отслеживать объекты в структурах или объединениях (поскольку они в этой точке являются простыми указателями C).
Даже если вы отметили файл / класс, о котором идет речь,
-fno-objc-arc
вы все равно можете передать ему объект, управляемый arc, в качестве параметра, что, скорее всего, приведет к утечке памяти.источник
-fno-objc-arc
для смешивания файлов ARC и не ARC в проекте, но если вы используете простые структуры C, такие как struct или union, в любом месте, вы вообще не можете использовать ARC.Похоже, теперь это работает без ошибок, возможно, после этого изменения .
т.е. вы можете поместить обычные (сильные) указатели на объекты Objective-C в структуру C. Он управляется ARC, например, он не сохраняется, когда структура разрушается. Проверено:
$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)
источник