views:

98

answers:

1

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?!?

+3  A: 

My guess is that somewhere you have activeItem = something instead of self.activeItem = something

The 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 activeItem more 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.)

Nimrod
Figured it out...your post got me thinking. it was still being retained by the view...
Meltemi
Also, no weak references (yet) on the iPhone (since there's no GC either...)
Kendall Helmstetter Gelner
Kendall Helmstetter Gelner: You can have a weak (that is, non-retaining) reference without GC. The `__weak` *keyword* is only for GC.
Peter Hosey
Yes of course, using an assign property - but I thought the original poster was referring to __weak as usually the term is only used in conjunction with __weak (at least I've never heard it used otherwise for Objective-C). I think I misread his point on that...
Kendall Helmstetter Gelner
I wasn't talking about __weak. I've never used GC in Objective-C since I've only ever done cocoa-touch, no cocoa, development, but really any time you have a reference that's not supposed to "own" an object and manage its reference count it can be considered a weak reference. It's just that garbage collectors have to be specifically told about them. Seems like a reasonable thing to do for a non-GC weak ref would be declare a property with an accessor that will return nil if the reference is no longer valid.
Nimrod