为什么IBOutletCollection指向故事板中的静态单元格返回null?

时间:2012-02-24 22:50:48

标签: iphone storyboard iboutlet

我已经在代码中定义了这个:

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

并合成。我绝对确定这个控制器用在故事板上,并将三个单元连接到这个集合。

接下来,在didSelectRowAtIndexPath:方法调用中,我添加了此代码,并添加了NSLog用于调试:

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

输出是这样的:

Certainty Cells: (null)

当然,预期的行为不会发生。

有关为何发生这种情况的任何想法?我确实确保使用的是静态单元,而不是动态原型。作为旁注,这三个单元也连接到(工作)它们自己的IBOutlets。

谢谢,

2 个答案:

答案 0 :(得分:36)

我通过对当时没有意义的修改找到了答案。 我将该属性从weak更改为strong,并且有效。

为什么我首先有(弱):

因为如果视图由于内存警告/等等而决定卸载,我不想让某些东西被解除分配。

为什么这种想法错了:

因为IBOutletCollection是NSSet或NSArray的实例。视图不保留NSSet / NSArray,因为它本身不是子视图。对于IBOutlet,弱属性很好,IBOutletCollection需要一个强属性,否则引用计数立即为零并且它被解除分配。

我要离开这里,希望能帮到别人。

答案 1 :(得分:3)

我会说(null)值是释放对象的结果,因为ARC猜测对象不是从任何人引用的,并且将值设置为nil加上在某些时候解除分配它。