2011-11-25 17 views
7

Soy nuevo en ARC, y tengo un objeto que tiene algunas clases internas como miembros. En el método init quiero asignar nuevos objetos para ellos.¿Por qué no puedo alloc/init - obtener la advertencia "Asignar objeto retenido a propiedad no segura"?

ClassA.h

#import "ClassB.h" 
@interface ClassA : NSObject 
@property (assign) ClassB *member; 
@end 

ClassB.h

@interface ClassB : NSObject 
@property (assign) NSString *name; 
@end 

ClassA.m

@synthesize member = _member; 
-(id)init 
{ 
    _member = [[ClassB alloc] init]; 
} 

Pero consigo "Asignación de objeto retenido a la propiedad insegura" errores. Busqué en las webs inter, y no veo ninguna otra información sobre esta advertencia específica. Se compila, pero obtiene una excepción de acceso incorrecto en tiempo de ejecución.

+3

Por favor, publique el archivo .h con sus variables de instancia. Tu código aquí está incompleto. – futureelite7

+2

Tuve el mismo problema hasta que cambié la propiedad "at" (asignar) a la propiedad "at" (fuerte, no atómica) –

Respuesta

12

El problema inmediato es que está asignando el objeto a un miembro marcado weak, lo que significa que el objeto no tendrá una referencia fuerte y será desasignado inmediatamente. El uso de strong o retain en lugar de weak o assign lo arreglará.

Un problema más grande con su método -init es que no llama a [super init], y no devuelve nada. Como mínimo, su -init debe tener el siguiente aspecto:

-(id)init 
{ 
    self = [super init]; 
    if (self != nil) { 
     self.member = [[ClassB alloc] init]; 
    } 
    return self; 
} 
+1

Gracias, mantuve el [superinicio] fuera por brevedad, pero, para completar, estás en lo cierto. Y gracias por la explicación, sé que entiendo por qué IBOutlets son débiles, y los objetos miembros fuera del xib deben ser fuertes. –

Cuestiones relacionadas