ARC забороняє об'єкти Objective-C у структурах або об'єднаннях, незважаючи на позначення файлу -fno-objc-arc? Чому це так?
У мене було припущення, що якщо ви позначите його -fno-objc-arc, у вас цього обмеження немає.
Відповіді:
Якщо ви отримали це повідомлення, спробуйте __unsafe_unretain. Це безпечно лише в тому випадку, якщо об’єкти в структурі не зберігаються. Приклад: Якщо ви використовуєте 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 для управління даними.
Це тому, що дуга не може відслідковувати об’єкти в структурах або об’єднаннях (оскільки вони в той момент є звичайними вказівниками на С).
Незважаючи на те, що ви позначили відповідний файл / клас, -fno-objc-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)