ARC prohíbe los objetos Objective-C en estructuras o uniones a pesar de marcar el archivo -fno-objc-arc

Respuestas:

170

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;
zeiteisen
fuente
4
también crea problemas cuando asigno la cadena, muestra una advertencia al asignar un objeto retenido a un objeto variable unsafe_unretained se liberará después de la asignación. Y cuando lo uso se bloquea
Deepak Singh Negi
8
Esto no resuelve todos los problemas, el objeto normalmente se liberaría de inmediato y, por lo tanto, no estaría disponible.
Diziet
sí, esto en realidad no funciona ... la solución es apagar de alguna manera ARC para un archivo fuente derivado que aún no he podido descifrar ...
nielsbot
1
Lo hace agregando la marca -fno-objc-arc al archivo en la fase de compilación.
Abizern
¿Qué sucede si el campo de estructura es solo una "referencia tonta", y el objeto en realidad se retiene (posee) en otro lugar (por ejemplo, dentro de una NSArray)? En ese caso, no se desasignará inmediatamente, pero me pregunto qué dirá el compilador (no puedo probarlo en este momento) ...
Nicolas Miari
30

En lugar de usar una estructura , puede crear una clase Objective-C para administrar los datos.

János
fuente
¿cómo? donde esta la muestra?
Entonces, ¿por qué no se puede estructurar para casos de uso pequeños?
Devanshu Saini
13

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.

voidStern
fuente
Pero entonces, ¿cómo puedo usar archivos de arco y no arco en mis proyectos? Por ejemplo, uso sharekit como non-arc y puedo usar instancias para publicar. Los archivos que estoy usando son archivos de arco.
Zsolt
Puede usar -fno-objc-arcpara 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.
voidStern
Gracias voidStern .. "pero si estás usando estructuras simples en C como struct o union en cualquier lugar, no puedes usar ARC en absoluto". - No creo que esto sea cierto. Estoy usando ARC para mis propios archivos. Y no arco para los archivos libharu. La forma en que resolví mi problema original fue pasar los valores por separado al archivo C y crear la estructura allí. Creo que la clave es el salto de arco a arco sin arco.
Zsolt
1
En absoluto, podría ser un poco exagerado. En esencia, no puede poner punteros a objetos en estructuras y uniones, lo que confundiría a ARC. El uso de una biblioteca C simple con estructuras y / o uniones debería (generalmente) ser posible.
voidStern
6

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)

Hiroshi Ichikawa
fuente
2
Novedades en LLVM - WWDC 2018
Sr. Ming