Por qué la propiedad pnetworkingeterminada de la propiedad Obj-C "asigna" en lugar de "fuerte"

Estoy agregando classs Swift a un proyecto antiguo. Todo salió bien, hasta que intenté agregar una propiedad a la class Swift. El encabezado generado no se comstack.

introduzca la descripción de la imagen aquí

Creo que el problema es que, en el código generado, Swift omitió una strong propiedad y solo lo declaró como no nonatomic . Normalmente, esto debería ser suficiente, porque @property debería ser propiedad strong por defecto, ¿verdad?

Entonces, básicamente, estos son equivalentes:

  • @property (nonatomic) NSDate *aDate;
  • @property (nonatomic, strong) NSDate *aDate;

Pero, en mi caso, parece que se está assign forma pnetworkingeterminada en vez de strong , de acuerdo con el post del comstackdor.

Estoy usando Xcode 6 GM, y el proyecto tiene ARC activado.

¿Alguna idea de por qué no es strong por defecto? ¿Puedo cambiar esto de alguna manera?

Estoy seguro de que, a la vez, "asignar" era el pnetworkingeterminado y esto …

http://cagt.bu.edu/whttp://iosberry.comb/b6/Objective-C_Programming_Language.pdf

"asignar – Especifica que el configurador usa la asignación simple. Es el valor pnetworkingeterminado".

… parece confirmar eso (página 59).

Sin embargo, también veo un documento de Apple ("Progtwigción con Objective-C") que dice: "Por defecto, las properties y variables de Objective-C mantienen fuertes references a sus objects". Creo que el cambio se realizó con la introducción de ARC.

Aunque diga que ARC está activado, si este proyecto tiene la edad suficiente, es posible que todavía haya algo que interfiera con la configuration de ARC.

Me doy count de que esta no es una respuesta definitiva, pero tal vez pueda ayudar la comprobación de la configuration del proyecto (o la limpieza del proyecto) con este cambio en mente.

Después de numerosos experimentos, descubrí una sutileza que determina el comportamiento de propiedad pnetworkingeterminado de una propiedad:

  • Si un file de encabezado se importa solo en classs habilitadas para ARC y no se ha declarado una propiedad pnetworkingeterminada, entonces la propiedad de la propiedad dentro de este file de encabezado es strong .
  • Si un file de cabecera se importa en al less una class no ARC , y no hay una propiedad pnetworkingeterminada declarada, ¡entonces la propiedad de la propiedad es assign !

Esto significa también que no debe importar un encabezado -Swift.h a ninguna class que no sea de ARC, ya que cambiará el comportamiento de todas las properties y emitirá advertencias (que en mi caso se convirtieron en errores).

Bastante extraño en mi humilde opinión …


Ejemplo:

  • tenemos classs SourceClass , ARCClass (ARC-enabled) y MRCClass (ARC-disabled)
  • SourceClass.h tiene: @property (nonatomic) NSDate *date;

Sutileza:

  • Si agregamos #import "SourceClass.h" solo en ARCClass.h o ARCClass.m ,
    • la date propiedad tiene una strong propiedad.
    • la statement es equivalente a @property (nonatomic, strong) NSDate *date; .
  • Tan pronto como agregamos #import "SourceClass.h" a MRCClass.h o MRCClass.m ,
    • la date propiedad tendrá asignada la propiedad en su lugar .
    • la statement se cambia a @property (nonatomic, assign) NSDate *date; .