ARC prohíbe los objetos Objective-C en estructuras o uniones a pesar de marcar el archivo -fno-objc-arc? ¿Por qué esto es tan?
Supuse que si lo marca -fno-objc-arc, no tiene esta restricción.
Respuestas:
Si recibió este mensaje, intente __unsafe_unretained. Solo es seguro si los objetos de la estructura no se retienen. Ejemplo: si usa OpenFeint con ARC, la clase OFBragDelegateStrings dice este error en una estructura.
typedef struct OFBragDelegateStrings
{
NSString* prepopulatedText;
NSString* originalMessage;
} OFBragDelegateStrings;
a
typedef struct OFBragDelegateStrings
{
__unsafe_unretained NSString* prepopulatedText;
__unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;
NSArray
)? En ese caso, no se desasignará inmediatamente, pero me pregunto qué dirá el compilador (no puedo probarlo en este momento) ...
En lugar de usar una estructura , puede crear una clase Objective-C para administrar los datos.
Esto se debe a que arc no puede rastrear objetos en estructuras o uniones (ya que en ese punto son punteros C simples).
A pesar de que marcó el archivo / clase en cuestión con -fno-objc-arc
, aún podría pasarle un objeto controlado por arco como parámetro, lo que probablemente resultaría en una pérdida de memoria.
-fno-objc-arc
para mezclar archivos ARC y no ARC dentro de un proyecto, pero si está usando estructuras C simples como struct o union en cualquier lugar, no puede usar ARC en absoluto.
Parece que esto ahora funciona sin errores, probablemente después de este cambio .
es decir, puede poner punteros normales (fuertes) a objetos Objective-C en una estructura C. Es administrado por ARC, por ejemplo, no se retiene cuando se destruye la estructura. Verificado con:
$ clang --version
Apple LLVM version 10.0.0 (clang-1000.11.45.2)