ARC забранява Objective-C обекти в структури или обединения въпреки маркирането на файла -fno-objc-arc? защо е така
Имах предположението, че ако го маркирате -fno-objc-arc, нямате това ограничение.
ARC забранява Objective-C обекти в структури или обединения въпреки маркирането на файла -fno-objc-arc? защо е така
Имах предположението, че ако го маркирате -fno-objc-arc, нямате това ограничение.
Ако получите това съобщение, опитайте __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;
NSArray
)? В такъв случай той няма да бъде незабавно освободен, но се чудя какво ще каже компилаторът (не мога да го тествам в момента)...
- person Nicolas Miari; 02.05.2014
Вместо да използвате структура, можете вместо това да създадете Objective-C клас за управление на данните.
Това е така, защото arc не може да проследява обекти в структури или съюзи (тъй като в тази точка те са обикновени C указатели).
Въпреки че сте маркирали въпросния файл/клас с -fno-objc-arc
, все още може да подадете обект, контролиран от arc, към него като параметър, което най-вероятно ще доведе до изтичане на памет.
-fno-objc-arc
за смесване на ARC и не ARC файлове в проект, но ако използвате обикновени C структури като struct или union навсякъде, не можете да използвате ARC изобщо.
- person voidStern; 11.11.2011
Изглежда, че това вече работи без грешки, вероятно след тази промяна.
т.е. можете да поставите нормални (силни) указатели към Objective-C обекти в C структура. Той се управлява от ARC, например не се запазва, когато структурата е унищожена. Проверено с:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)