I just noticed this in some code that’s been working for months. Though it makes me curious I’m sure we’ve been living on borrowed time…
Assuming activeItem:
@property (nonatomic, retain) ItemView *activeItem;
And we have this conditional in touchesEnded:
if (CGRectContainsPoint(dropRect, touchLocation)) {
ItemView *replacementItem = [[ItemView alloc] initWithFrame:frame];
[newItems replaceObjectAtIndex:[newItems indexOfObject:activeItem] withObject:replacementItem];
[self addSubview:replacementItem];
[controller.view.subView addItem:activeItem];
[replacementItem goCenter];
[replacementItem release];
}
The only thing that’s retaining activeItem is the NSArray, newItems. Should I retain it before the call to replaceObjectAtIndex and then release it when I release replacementItem? Another way?
Seems to be working fine but isn’t it only a matter of time before EXC_BAD_ACCESS?!?
My guess is that somewhere you have
activeItem = somethinginstead ofself.activeItem = somethingThe difference is that the “self” dot version goes through the synthesized mutator (setter) method which would perform a retain before assigning to the ivar. This assumes that you have a synthesized method or a manually constructed one that does what the property claims it will.
It may not be making any difference though since you may just be using this as a weak reference. If you really do want a weak reference you might want to change that retain to assign and read up on the Objective-C conventions for weak references.
(In this case it looks like you’re using
activeItemmore like an index into something rather than a “container” designed to “own” the object, and this makes it a scenario for weak references IF that is what you’re intending it for.)