#iphone #objective-c #struct #ios5 #automatic-ref-counting
#iPhone #objective-c #структура #ios5 #автоматический подсчет ссылок
Вопрос:
ARC запрещает объекты Objective-C в структурах или объединениях, несмотря на маркировку файла -fno-objc-arc? Почему это так?
У меня было предположение, что если вы пометите его -fno-objc-arc, у вас не будет этого ограничения.
Ответ №1:
Если вы получили это сообщение, попробуйте __unsafe_unretained. Это безопасно только в том случае, если объекты в структуре не сохраняются. Пример: Если вы используете OpenFeint с ARC, класс bragdelegatestrings сообщает об этой ошибке в структуре.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
Для
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
Комментарии:
1. это также создает проблемы, когда я выделяю строку, в которой отображается предупреждение о присвоении сохраненного объекта переменной unsafe_unretained object, которая будет выпущена после присвоения. И когда я использую его, происходит сбой
2. Это не решает всех проблем, объект обычно был бы немедленно освобожден и, следовательно, недоступен.
3. да — на самом деле это не работает … решение состоит в том, чтобы каким-то образом отключить ARC для производного исходного файла, который я пока не смог выяснить…
4. Вы делаете это, добавляя флаг -fno-objc-arc к файлу на этапе сборки.
5. Что, если поле struct является всего лишь «немой ссылкой», и объект фактически сохраняется (принадлежит) где-то еще (скажем, внутри
NSArray
)? В этом случае он не будет немедленно освобожден, но мне интересно, что скажет компилятор (не могу проверить это прямо сейчас)…
Ответ №2:
Вместо использования структуры, вы можете создать класс Objective-C для управления данными вместо этого.
Комментарии:
1. как? где образец?
2. Итак, почему нельзя использовать struct для небольших вариантов использования?
Ответ №3:
Это потому, что arc не может отслеживать объекты в структурах или объединениях (поскольку они в этот момент являются простыми указателями C).
Даже если вы отметили файл / класс, о котором идет речь, с помощью -fno-objc-arc
вы все равно можете передать ему объект, управляемый arc, в качестве параметра, что, скорее всего, приведет к утечке памяти.
Комментарии:
1. Но тогда как я могу использовать файлы arc и не-arc в своих проектах. Например, я использую sharekit как не-arc, и я могу использовать экземпляры для публикации. Файлы, которые я использую, являются файлами arc.
2. Вы можете использовать
-fno-objc-arc
для смешивания файлов ARC и не ARC в проекте, но если вы используете обычные структуры C, такие как struct или union, где угодно, вы не сможете использовать ARC вообще.3. Спасибо voidStern.. «но если вы используете обычные структуры C, такие как struct или union, где угодно, вы вообще не можете использовать ARC». — Я не думаю, что это правда. Я использую ARC для своих собственных файлов. И не-arc для файлов libharu. Способ, которым я обошел свою первоначальную проблему, состоял в том, чтобы передать значения отдельно в файл C и создать там структуру. Я думаю, что ключевым моментом является переход от дуги к не-дуге к дуге.
4. Вообще может быть немного преувеличено. По сути, вы не можете помещать указатели на объекты в структуры и объединения, что могло бы запутать ARC. Использование простой библиотеки C со структурами и / или объединениями должно (обычно) быть возможным.
Ответ №4:
Похоже, что теперь это работает без ошибок, вероятно, после этого изменения.
т.е. вы можете поместить обычные (строгие) указатели на объекты Objective-C в структуру C. Он управляется ARC, например, он не восстанавливается при разрушении структуры. Проверено с помощью:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)
Комментарии:
1. Что нового в LLVM — WWDC 2018