我在NIB文件中布置了一个 View ,然后将UIView子类添加为文件所有者。
子类如下所示:
@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;
由于这个原因,属性很弱:https://stackoverflow.com/a/7729141/1016515
然后,我将标签和UIImageViews插入 Nib ,从 View 到文件所有者。
然后,在子类的awakeFromNib部分中,我这样做了:
[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);
我希望看到categoryLabel和图像的地址。相反,我发现类别标签很好,图像为
nil
。这很令人困惑,因为
images
和categoryLabel
的声明是相同的。为什么一个工作而另一个失败? 最佳答案
我提出这个问题是因为我在任何地方都找不到问题,但是如果您习惯于使用IBOutlet而不是IBOutletCollections,这似乎是一个很容易犯的错误。
我设置了weak
属性,因为出于另一个问题中讨论的原因,这通常是我对IBOutlets所做的。
我忽略的是,IBOutletCollection是类的实例变量,而不仅仅是对 View 层次结构的任意引用。因此,如果它是弱属性,则NSArray *
将立即被释放,因为 View 层次结构不会像其他IBOutlet属性那样保留它。
修复很简单,将属性设为strong
:
@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;
更新:根据this answer,几乎所有IBOutlet都应为强,除非它们必须为弱以免发生保留周期。这是新的,大多数文档仍然说商店应该很薄弱。