ARC забороняє об'єкти Objective-C у структурах або об'єднаннях, незважаючи на позначення файлу -fno-objc-arc


85

ARC забороняє об'єкти Objective-C у структурах або об'єднаннях, незважаючи на позначення файлу -fno-objc-arc? Чому це так?

У мене було припущення, що якщо ви позначите його -fno-objc-arc, у вас цього обмеження немає.

Відповіді:


170

Якщо ви отримали це повідомлення, спробуйте __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;

4
це також створює проблеми, коли я виділяю рядок, який показує попередження про присвоєння збереженого об'єкта змінному об'єкту unsafe_unretain буде звільнено після призначення. І коли я використовую, він падає
Діпак Сінгх Негі

8
Це не вирішує всіх проблем, об'єкт, як правило, негайно звільняється і, таким чином, стає недоступним.
Diziet

так - це насправді не працює ... рішення полягає в тому, щоб якось вимкнути ARC для похідного вихідного файлу, який я ще не зміг зрозуміти ...
nielsbot

1
Ви робите це, додаючи прапор -fno-objc-arc до файлу на етапі побудови.
Abizern,

Що робити, якщо поле struct є лише "німим посиланням", а об'єкт фактично зберігається (належить) десь в іншому місці (скажімо, всередині an NSArray)? У такому випадку його не буде негайно вивільнено, але мені цікаво, що скаже компілятор (не може зараз перевірити) ...
Ніколас Міарі,

30

Замість того, щоб використовувати структуру , ви можете створити клас Objective-C для управління даними.


як? де проба?

То чому не можна структурувати для невеликих випадків використання?
Devanshu Saini

13

Це тому, що дуга не може відслідковувати об’єкти в структурах або об’єднаннях (оскільки вони в той момент є звичайними вказівниками на С).

Незважаючи на те, що ви позначили відповідний файл / клас, -fno-objc-arcви все одно можете передавати йому об'єкт, керований дугою, як параметр, що, швидше за все, призведе до витоку пам'яті.


Але тоді, як я можу використовувати дугові та не дугові файли у своїх проектах. Наприклад, я використовую sharekit як недуговий, і я можу використовувати екземпляри для публікації. Файли, якими я їх використовую, є дуговими.
Zsolt

Ви можете використовувати -fno-objc-arcдля змішування ARC-файлів та не ARC-файлів у проекті, але якщо ви використовуєте прості C-структури, такі як struct або union, ви взагалі не можете використовувати ARC.
voidStern

Дякуємо voidStern .. "але якщо ви використовуєте прості C-структури, такі як struct або union десь, ви взагалі не можете використовувати ARC." - Я не думаю, що це правда. Я використовую ARC для власних файлів. І не дуговий для файлів libharu. Я обійшов свою початкову проблему, передавши значення окремо у файл C і створивши там структуру. Думаю, ключовим є стрибок з дуги на недугу на дугу.
Zsolt

1
Взагалі може бути трохи перебільшеним. По суті, ви не можете вказувати об'єкти на об'єкти та об'єднання, що може заплутати ARC. Використання звичайної бібліотеки C зі структурами та / або об'єднаннями (зазвичай) має бути можливим.
voidStern

6

Схоже, це тепер працює без помилок, можливо, після цієї зміни .

тобто ви можете розмістити звичайні (сильні) вказівники на об’єкти Objective-C у структурі C. Це управляється ARC, наприклад, воно не зберігається, коли структура руйнується. Підтверджено:

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.