I have some custom created UIViews that use .xib files for layout, and backing classes for extra setup. I create these classes using alloc/init and calling loadNibNamed in my custom init method but in doing so was causing memory leak. Someone pointed out that the alloc portion actually created a self object that was leaking so I adjusted my init method to this one:
- (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;
}
However, now when I run analyze code I get this warning "Returning 'self' while it is not set to the result of '[(super or self) init...]'". So my question is what is the correct way for doing custom UIViews with a backing class?
Since it was asked I'd used this above code like this:
AssignmentView * assignmentView = [[AssignmentView alloc] init];
[self.view addSubview:assignmentView];
Would you consider using the convenience constructor style?
+ (AssignmentView *)assignmentView
{
AssignmentView *result = [[[NSBundle mainBundle] loadNibNamed:@"AssignmentView" owner:nil options:nil] lastObject];
[result setupBranding];
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];
[result addGestureRecognizer:tapRecognizer];
[tapRecognizer release];
return result;
}
It gives you the flexibility you seem to need when construct your view, but doesn't cause a memory leak or warnings.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With