我偶尔会覆盖Objective-C属性的setter,并且想知道。如果我大幅改变方法的默认行为,我应该在标题中将其记录在哪里?或者我应该完全使用新方法吗?
在我目前的情况下,我在界面构建器中将视图设置为占位符视图。以编程方式,将有一种方法用新视图(图标或任意自定义视图)替换此视图。换出占位符视图的方法将自动将属性设置为新视图,从父视图中删除占位符视图,将新视图添加到父视图,并相应地重新定位/调整新视图的大小。
我想出了三个选择:
A)覆盖属性的setter,并将文档与属性一起文档:
// Documentation goes here
// The setter of this property actually does <etc>
@property (nonatomic, retain) IBOutlet UIView* placeholderView;
B)覆盖setter,并在标题中声明它:
// Documentation goes here
-(void)setPlaceholderView:(UIView*)view;
C)使用完全不同的方法并将属性设置为readonly:
@property (nonatomic, retain, readonly) IBOutlet UIView* placeholderView;
-(void)replacePlaceholderView:(UIView*)view;
选项C似乎很有吸引力,因为它很清楚该方法的作用。还将清楚的是,由于它与普通的设定器不同,它可能以不同的方式起作用(它将会)。我在这里看到的缺点是它似乎没有遵循正常的Objective-C趋势。
你们认为做这样的事最干净的方法是什么?
答案 0 :(得分:1)
实际上,只应在初始化期间从nib文件设置IBOutlet
。如果我要重构这个,我会声明属性
@property (nonatomic, weak) IBOutlet UIView *initialPlaceholderView;
@property (nonatomic, weak) UIView *placeholderContainerView;
@property (nonatomic, weak) UIView *currentPlaceholderView;
然后将replacePlaceholderView:
重命名为
-(void)updatePlaceholderContainerWithNewView:(UIView*)newPlaceholderView;
这是自我记录的代码。您已经可以通过属性和方法名称来假设行为。
答案 1 :(得分:1)
你根本不应该“彻底改变[setter]方法的默认行为”。 setter方法应该设置一个属性,如果是这样,你不需要在任何地方记录标题中的覆盖,因为它完全符合用户的期望,而覆盖是一个实现细节,可以在实施文件。从根本上改变预期的行为只会产生混乱,并且是要避免的。使用选项(C),除非您想要的行为是用户在设置该属性时合理预期会发生的行为。