Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is an IBOutletCollection pointing to static cells from storyboard returning null?

I have defined this in code:

@property (nonatomic, weak) IBOutletCollection(UITableViewCell) NSSet * certaintyCells;

and synthesized. I made absolutely sure that this controller is used in story board, and connected three cells to this collection.

Next, in the didSelectRowAtIndexPath: method call, I added this code, with NSLog added for debugging:

        NSLog(@"Certainty Cells: %@",certaintyCells);
        for (UITableViewCell * cell in certaintyCells) {
            [cell.textLabel setTextColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:1]];
            [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
        }

The output is this:

Certainty Cells: (null)

And of course, behaviour expected does not happen.

Any ideas as to why this is happening? I did make sure that I am using static cells, and not dynamic prototypes. As a side note, these three cells are also connected to (working) IBOutlets of their own.

Thanks,

like image 765
Alex Gosselin Avatar asked Feb 24 '12 22:02

Alex Gosselin


2 Answers

I found the answer by making changes that didn't make sense to me at the time. I changed the property from weak to strong, and it worked.

Why I had (weak) in the first place:

Because I didn't want to keep something from being deallocated if the view decided to unload due to memory warnings/etc.

Why this thinking was wrong:

Because an IBOutletCollection is an instance of NSSet or NSArray. that NSSet/NSArray isn't retained by the view, because it isn't itself a subview. With an IBOutlet a weak property is fine, with an IBOutletCollection a strong property is needed, otherwise the reference count is zero immediately and it is deallocated.

I'm leaving this here in hope that it helps somebody else.

like image 147
Alex Gosselin Avatar answered Sep 28 '22 07:09

Alex Gosselin


I would say that (null) value is consequence of freeing object since ARC guessed that object is not referenced from anyone and sets value to nil plus deallocating it at some point.

like image 41
vedrano Avatar answered Sep 28 '22 08:09

vedrano