ARC proíbe objetos Objective-C em structs ou uniões, apesar de marcar o arquivo -fno-objc-arc? Porque isto é assim?
Presumi que, se você marcar -fno-objc-arc, você não terá essa restrição.
Respostas:
Se você recebeu esta mensagem, tente __unsafe_unretained. Só é seguro se os objetos na estrutura não forem retidos. Exemplo: Se você usar OpenFeint com ARC, a classe OFBragDelegateStrings informa esse erro em uma estrutura.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
para
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
)? Nesse caso, ele não será desalocado imediatamente, mas eu me pergunto o que o compilador dirá (não posso testá-lo agora) ...
Em vez de usar uma estrutura , você pode criar uma classe Objective-C para gerenciar os dados.
Isso ocorre porque o arco não pode rastrear objetos em estruturas ou uniões (já que eles são, nesse ponto, ponteiros C simples).
Mesmo que tenha marcado o arquivo / classe em questão, -fno-objc-arc
você ainda pode passar um objeto controlado por arco para ele como parâmetro, o que provavelmente resultaria em um vazamento de memória.
-fno-objc-arc
para misturar arquivos ARC e não ARC dentro de um projeto, mas se estiver usando estruturas C simples, como struct ou união em qualquer lugar, não poderá usar ARC.
Parece que agora funciona sem erros, provavelmente após essa alteração .
ou seja, você pode colocar ponteiros normais (fortes) para objetos Objective-C em uma estrutura C. É gerenciado pelo ARC, por exemplo, não é retido quando a estrutura é destruída. Verificado com:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)