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