我在我的.h文件中声明了一个属性
@property (weak, nonatomic) UIPickerView *levelPicker;
这在我的实现文件中被合成为:
@synthesize levelPicker = _levelPicker;
我随后在同一个实现文件中有一个代码块,执行以下操作:
if (self.levelPicker == nil) {
self.levelPicker = [[UIPickerView alloc] initWithFrame:CGRectZero];
self.levelPicker.delegate = self;
self.levelPicker.dataSource = self;
}
textField.inputView = self.levelPicker;
在这种情况下,self._levelPicker没有设置为新的UIPickerView。即,self.levelPicker = blah赋值不起作用。
然而,如果我将属性声明更改为:
@property (strong, nonatomic) UIPickerView *levelPicker;
然后一切都按照预期工作,_levelPicker被设置为新分配的UIPickerView。
有人能告诉我为什么会这样吗?我以为我已经理解了引用的工作原理,但我想我还有更多要学习的。我阅读了一些其他相关的SO帖子,但对我来说仍然不是完全清楚的。
textField.inputView = [[UIPickerView alloc] initWithFrame:frame]
,然后直接配置 textField.inputView,但我尽量避免这样做,以防所分配的属性(在此情况下为 inputView)具有依赖于被分配对象状态的自定义 setter 逻辑。 - Simon Whitaker