2012-02-24 13 views
8

he definido esto en código:¿Por qué un IBOutletCollection apunta a que las celdas estáticas del guión gráfico devuelven nulo?

@property (nonatomic, weak) IBOutletCollection(UITableViewCell) NSSet * certaintyCells; 

y sintetizada. Me aseguré absolutamente de que este controlador se utilizara en el storyboard y conecté tres células a esta colección.

A continuación, en la llamada al método didSelectRowAtIndexPath:, he añadido el código, con NSLog añadido para la depuración:

 NSLog(@"Certainty Cells: %@",certaintyCells); 
     for (UITableViewCell * cell in certaintyCells) { 
      [cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]]; 
      [cell setSelectionStyle:UITableViewCellSelectionStyleBlue]; 
     } 

La salida es la siguiente:

Certainty Cells: (null) 

Y, por supuesto, el comportamiento esperado no lo hace ocurrir.

¿Alguna idea de por qué esto está sucediendo? Me aseguré de estar usando células estáticas y no prototipos dinámicos. Como nota al margen, estas tres celdas también están conectadas a IBOutlets (de trabajo) propias.

Gracias,

Respuesta

33

he encontrado la respuesta al hacer cambios que no tienen sentido para mí en ese momento. Cambié la propiedad de weak a strong, y funcionó.

Por qué tuve (débil) en el primer lugar:

Porque no quiero seguir siendo algo de desasignado si la vista decidió descargar debido a las advertencias de memoria/etc.

¿Por qué este pensamiento estaba equivocado:

Debido a que un IBOutletCollection es una instancia de NSSet o NSArray. NSSet/NSArray no es retenido por la vista, porque no es una subvista. Con un IBOutlet una propiedad débil está bien, con un IBOutletCollection se necesita una propiedad fuerte; de ​​lo contrario, el recuento de referencias es cero inmediatamente y se desasigna.

Me voy aquí con la esperanza de que ayude a otra persona.

+0

Pensé lo mismo, no pude encontrar la respuesta en el documento de Apple. Cambió a fuerte, funciona ahora. Me pregunto si será desmantelado ... ¿alguien? – Oritm

+0

Debe desasignarse automáticamente cuando el controlador de vista desasigna, puede configurarlo en nulo en viewDidUnload si desea destrabar allí. –

3

Yo diría que el valor (nulo) es la consecuencia del objeto liberado ya que ARC supuso que el objeto no está referenciado por nadie y establece el valor en nulo más la desasignación en algún momento.

Cuestiones relacionadas