内部类,实例变量或属性?
问题描述:
在表单上,我使用-[UITextFieldDelegate textFieldDidEndEditing]:
来注册任何错误,并将它们存储在NSMutableArray
实例变量formErrors
中。内部类,实例变量或属性?
当我按下提交按钮时,我将使用formErrors
,或者可能在窗体上出现错误时禁用按钮禁用。
错误消息能穿上formErrors
这样的:
-(void)textFieldDidEndEditing:(UITextField *)textField
{
if (textField == [self nameField]) {
if (([[textField text] length] < 2) || ([[textField text] length] > 20)) {
[[formErrors addObject:@"Name must contain a minimum of 2 and a maximum of 20 characters only."];
} else {
if ([[textField text] rangeOfCharacterFromSet:alphaSet].location != NSNotFound) {
[[formErrors addObject:@"Name must contain letters and spaces only."];
}
}
}
}
我试图找出让存储formErrors对象,使他们能够各个领域都被检查之后访问的最佳途径。
了什么工作对我来说是声明实例VAR:
{
NSMutableArray *formErrors;
}
然后在viewDidLoad:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
formErrors = [[NSMutableArray alloc] init];
然后初始化在prepareForSegue:
我有一些临时代码来检查一切正常:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
int errCount = [formErrors count];
// check if all textfield values are filled in if not then disallow form submit
for (NSString *error in formErrors) {
NSLog(@"Total %d errors, \n Error Message: %@", errCount, error);
}
由于某些原因,感觉不对。我应该宣布一个财产吗?我想要做的是,当我进入和离开田地时,检查是否有任何错误;如果有,只需将错误消息存储在formErrors
中,这样我就可以在prepareForSegue:
中执行我需要的操作。
我注意到,在处理这些类型的场景时我有些困惑。
答
如果我是你,我会坚持更简单的&更直接的纯粹ivars - 就像你在这里做的一样 - 直到你有足够的经验来形成你自己的意见。
更一般地说,我认为这是优先考虑的。有些人喜欢通过属性声明来制作所有的ivars。其他人更喜欢纯粹的伊娃宣言的重量轻。在某些情况下(KVO),财产申报将赢得胜利。
这仅适用于硬皮旧的非ARC,但如果你发现自己做这一次或多次:
[myObject release]
myObject = [newObject retain];
你可能会与属性的语法,例如更好
self.myObject = newObject;
在你的第一个代码示例中使用'[self formErrors]'意味着它被声明为一个属性,或者你已经设置了一个方法来公开它。否则,你只是将它作为'formErrors'访问。你可以解释吗? –
复制并粘贴旧代码。刚纠正它。 – LondonGuy
很多人会告诉你只有一个正确的方式(他们的方式!),但它真的很“糊”。我倾向于使用指针变量的属性,以便所有retain/strong/dealloc鲤鱼可以保持一种集中式,但对于ARC来说这是不太必要的。 –