我已经在代码中定义了这个:
@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。
谢谢,
答案 0 :(得分:36)
我通过对当时没有意义的修改找到了答案。 我将该属性从weak
更改为strong
,并且有效。
为什么我首先有(弱):
因为如果视图由于内存警告/等等而决定卸载,我不想让某些东西被解除分配。
为什么这种想法错了:
因为IBOutletCollection是NSSet或NSArray的实例。视图不保留NSSet / NSArray,因为它本身不是子视图。对于IBOutlet,弱属性很好,IBOutletCollection需要一个强属性,否则引用计数立即为零并且它被解除分配。
我要离开这里,希望能帮到别人。
答案 1 :(得分:3)
我会说(null)值是释放对象的结果,因为ARC猜测对象不是从任何人引用的,并且将值设置为nil加上在某些时候解除分配它。