div*_*gio 17 xcode objective-c interface-builder ios
我在NIB文件中布局了一个视图,然后将我的UIView子类添加为文件所有者.
子类看起来像这样:
@property (nonatomic, weak) IBOutlet UILabel *categoryLabel;
@property (nonatomic, weak) IBOutletCollection(UIImageView) NSArray *images;
Run Code Online (Sandbox Code Playgroud)
由于这个原因,属性很弱:https://stackoverflow.com/a/7729141/1016515
然后我将标签和UIB中的UIImageViews从视图连接到文件所有者.
然后,在子类的awakeFromNib部分,我这样做了:
[[NSBundle mainBundle] loadNibNamed:@"CategoryButton" owner:self options:nil];
NSLog(@"label: %@",self.categoryLabel);
NSLog(@"images: %@",self.images);
Run Code Online (Sandbox Code Playgroud)
我希望看到categoryLabel和图像的地址.相反,我发现类别标签很好,图像是nil.
这是非常令人费解的,因为声明images和categoryLabel相同.为什么一个工作而另一个工作失败?
div*_*gio 78
我这样做是因为我没有在任何地方找到问题,但如果你习惯使用IBOutlets而不是IBOutletCollections,那么这似乎是一个非常容易犯的错误.
我制作了这些属性,weak因为这是我通常为IBOutlets做的事情,原因是在另一个问题中讨论过.
我忽略的是IBOutletCollection是类的实例变量,而不仅仅是对视图层次结构的任意引用.因此,如果它是弱属性,NSArray *则会立即释放,因为视图层次结构不像其他IBOutlet属性那样保留它.
修复很简单,使属性strong:
@property (nonatomic, strong) IBOutletCollection(UIImageView) NSArray *images;
Run Code Online (Sandbox Code Playgroud)
更新:根据这个答案,几乎所有IBOutlets都应该是强大的,除非它们必须是弱的以避免保留周期.这是新的,大多数文档仍然说出口应该是弱的.