再次讨论Objective-C中的self和instance变量

时间:2011-07-22 13:43:31

标签: objective-c

在某些书中,我注意到Apple的代码示例和互联网资源直接访问ivar而不是使用合成访问器。在我看来,它经常用于UILabel,UITextFiled和UITextView。

@interface MagicViewController : UIViewController {
    UITextField *aField;
}
@property (nonatomic, retain) UITextField *field; 


@implementation MagicViewController

@synthesize aField; 

- (void) superMethod 
{
    aField.text = @"Bla-bla-bla";

    NSString *string = [NSString stringWithString:aField.text];
    NSLog(@"Ho-ho-ho %@", string);

}

问题:出于某些原因它是否安全?他们为什么不使用

- (void) superMethod 
{
    self.aField.text = @"Bla-bla-bla";

    NSString *string = [NSString stringWithString:self.aField.text];

    NSLog(@"Ho-ho-ho %@", string);

}

2 个答案:

答案 0 :(得分:1)

不使用访问者保证您正在访问的内容实际上是ivar字段,因为子类可以覆盖.aField,提供其他内容。

这是你想要或不想变化的东西。

这是示例代码避免访问者支持直接访问的一个可能原因,但是在任何给定情况下完成它的原因并不一定容易知道。

另一个可能的原因是访问ivar更快,特别是在iOS上,周期来之不易。

答案 1 :(得分:0)

在这种特殊情况下,无论哪种方式都可以正常工作。他们喜欢在参考文献中定义所有内容,以便您可以准确地看到发生了什么。