Ios 从NIB加载视图时,IBOutletCollection为零,即使其他IBOutlet';他们工作得很好

Ios 从NIB加载视图时,IBOutletCollection为零,即使其他IBOutlet';他们工作得很好,ios,objective-c,xcode,interface-builder,Ios,Objective C,Xcode,Interface Builder,我在NIB文件中布置了一个视图,然后添加了UIView子类作为文件所有者 子类如下所示: @property (nonatomic, weak) IBOutlet UILabel *categoryLabel; @property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images; 由于以下原因,属性较弱: 然后,我将标签和UIImageView从视图连接到nib中的文件所有者 然后,在子类的awakeFromN

我在NIB文件中布置了一个视图,然后添加了UIView子类作为文件所有者

子类如下所示:

@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;
由于以下原因,属性较弱:

然后,我将标签和UIImageView从视图连接到nib中的文件所有者

然后,在子类的awakeFromNib部分,我做了以下操作:

[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);
我希望看到分类标签的地址和图片。相反,我发现分类标签很好,图像是
nil


这相当令人费解,因为
图像
类别标签
的声明是相同的。为什么一个工作,另一个失败

我之所以提出这个问题,是因为我在任何地方都找不到这个问题,但如果你习惯于使用IBOutlets而不是IBOutletCollections,那么这似乎是一个很容易犯的错误

我使属性
,因为出于另一个问题中讨论的原因,这是我通常为IBOutlets所做的

我忽略的是,IBOutletCollection是类的一个实例变量,而不仅仅是对视图层次结构的任意引用。因此,如果它是一个弱属性,
NSArray*
将立即被释放,因为视图层次结构没有像其他IBOutlet属性那样保留它

修复方法很简单,将属性设置为strong:

@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;

更新:根据,几乎所有IBOUTLE都应该是强的,除非它们必须是弱的以避免保留周期。这是新的,大多数文件仍然说,出口应该是薄弱的

工作。很容易错过这个。我也有同样的想法!也错过了它,因为它很弱,它会自动失效,并且不会因为forin(foreach,随便什么)而崩溃