Tengo algunas UIViews creadas a medida que usan archivos .xib para el diseño y clases de respaldo para una configuración adicional. Creo estas clases usando alloc/init y llamando a loadNibNamed en mi método init personalizado pero al hacerlo estaba causando pérdida de memoria. Alguien señaló que la parte alloc realmente se crea un objeto de sí mismo que estaba goteando así que ajusté mi método init a éste:Forma correcta de iniciar una UIView con .xib y clase de respaldo
- (id)init
{
[self autorelease];
self = [[[[NSBundle mainBundle] loadNibNamed:@"AssignmentView" owner:nil options:nil] lastObject] retain];
[self setupBranding];
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
[self addGestureRecognizer:tapRecognizer];
[tapRecognizer release];
return self;
}
Sin embargo, ahora cuando corro analizar código consigo esta advertencia "Volviendo 'auto', mientras no está configurado para el resultado de '[(super o self) init ...]' ". Entonces mi pregunta es ¿cuál es la forma correcta de hacer UIViews personalizados con una clase de respaldo?
Desde que se preguntó que había utilizado este código por encima de la siguiente manera:
AssignmentView * assignmentView = [[AssignmentView alloc] init];
[self.view addSubview:assignmentView];
Generalmente, si carga una vista desde un xib, debe cargarla a través de 'loadNibNamed' en cualquier clase en la que esté creando y luego configurarlo en su método' awakeFromNib', sin siquiera tocar 'init' . Esta ha sido mi experiencia, de todos modos. ¿Podría quizás agregar algún código donde esté instanciando la vista y su método 'awakeFromNib'? –
Creo que simplemente agregarías 'self = [super init]' en la parte superior de tu método. Sin embargo, Paul tiene razón, ya que normalmente no estás cargando la punta internamente. – Dustin
Gracias, he estado tratando de evitar todo loadNibNamed y simplemente uso [[MyView alloc] init], pero si tengo que volver a trabajar con eso y en su lugar uso loadNibNamed entonces supongo que debo hacerlo. No tengo un método awakeFromNib pero todo en el init iría allí. –