ARC забранява Objective-C обекти в структури или обединения въпреки маркирането на файла -fno-objc-arc

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

Имах предположението, че ако го маркирате -fno-objc-arc, нямате това ограничение.


person Zsolt    schedule 11.11.2011    source източник


Отговори (4)


Ако получите това съобщение, опитайте __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;
person zeiteisen    schedule 02.12.2011
comment
също така създава проблеми, когато разпределя низа, който показва предупреждение, присвояване на задържан обект на unsafe_unretained променлива обект ще бъде освободен след присвояването. И когато го използвам, се срива - person Deepak Singh Negi; 14.06.2012
comment
Това не решава всички проблеми, обектът обикновено би бил незабавно освободен и следователно недостъпен. - person Diziet; 17.09.2012
comment
да--това всъщност не работи... решението е по някакъв начин да изключа ARC за извлечен изходен файл, което все още не мога да разбера... - person nielsbot; 26.03.2013
comment
Вие правите това, като добавите флага -fno-objc-arc към файла във фазата на изграждане. - person Abizern; 16.10.2013
comment
Какво ще стане, ако полето struct е само тъпа препратка и обектът всъщност се запазва (притежава) някъде другаде (да речем в NSArray)? В такъв случай той няма да бъде незабавно освободен, но се чудя какво ще каже компилаторът (не мога да го тествам в момента)... - person Nicolas Miari; 02.05.2014

Вместо да използвате структура, можете вместо това да създадете Objective-C клас за управление на данните.

person János    schedule 12.10.2013
comment
как къде е пробата? - person ; 08.03.2017
comment
Така че защо не може да се структурира за малки случаи на употреба? - person Devanshu Saini; 26.03.2018

Това е така, защото arc не може да проследява обекти в структури или съюзи (тъй като в тази точка те са обикновени C указатели).

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

person voidStern    schedule 11.11.2011
comment
Но тогава как мога да използвам arc и non-arc файлове в моите проекти. Например използвам sharekit като non-arc и мога да използвам екземпляри за публикуване. Файловете, които използвам, са arc файлове. - person Zsolt; 11.11.2011
comment
Можете да използвате -fno-objc-arc за смесване на ARC и не ARC файлове в проект, но ако използвате обикновени C структури като struct или union навсякъде, не можете да използвате ARC изобщо. - person voidStern; 11.11.2011
comment
Благодаря voidStern.. но ако използвате обикновени C структури като struct или union навсякъде, не можете да използвате ARC изобщо. - Не мисля, че това е вярно. Използвам ARC за собствените си файлове. И без дъга за файловете libharu. Начинът, по който заобиколих първоначалния си проблем, беше да предам стойностите отделно в C файла и да създам структурата там. Мисля, че ключът е скокът от дъга към не-дъга към дъга. - person Zsolt; 12.11.2011
comment
Изобщо може да е малко преувеличено. По същество не можете да поставите указатели към обекти в структури и обединения, което би объркало ARC. Използването на обикновена C библиотека със структури и/или обединения трябва (обикновено) да е възможно. - person voidStern; 12.11.2011

Изглежда, че това вече работи без грешки, вероятно след тази промяна.

т.е. можете да поставите нормални (силни) указатели към Objective-C обекти в C структура. Той се управлява от ARC, например не се запазва, когато структурата е унищожена. Проверено с:

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

person Hiroshi Ichikawa    schedule 10.10.2018
comment
Какво е новото в LLVM - WWDC 2018 - person Mr. Ming; 10.04.2019