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

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

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

Ответы [ 4 ]

171 голосов
/ 02 декабря 2011

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

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

до

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
30 голосов
/ 12 октября 2013

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

13 голосов
/ 11 ноября 2011

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

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

5 голосов
/ 10 октября 2018

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

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

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

...