17

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

子类如下所示:

@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;

因此属性很弱:https ://stackoverflow.com/a/7729141/1016515

然后我将标签和笔尖中的 UIImageViews 从视图连接到文件所有者。

然后,在子类的 awakeFromNib 部分,我这样做了:

[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);

我希望看到 categoryLabel 和图像的地址。相反,我发现类别标签很好,图像是nil.

这很令人费解,因为 和 的声明imagescategoryLabel相同的。为什么一个工作,另一个失败?

4

1 回答 1

78

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

我制作了这些属性weak,因为这是我通常为 IBOutlets 做的事情,原因在另一个问题中讨论过。

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

修复很简单,使属性strong

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

更新:根据这个答案,几乎所有 IBOutlets 都应该是强的,除非它们必须弱以避免保留循环。这是新的,大多数文档仍然说网点应该很弱。

于 2013-05-03T08:43:13.093 回答