什么是名为的简单属性的getter方法

时间:2015-03-29 05:30:55

标签: objective-c

我试图了解使用属性时生成的方法。 说我有以下声明

@property int myint;

现在我知道我可以这样访问这些变量(比如d是我的类的实例)

d.myint = 12; //this is equivalent to [d setMyint:12];
NSLog(@"The value is %d",d.myint); // what method is generated ?

什么是getter方法?我的印象是它被称为getMyint但是不可用?如果我可能在这里遗漏了什么建议吗?

4 个答案:

答案 0 :(得分:1)

如其他答案中所述,proerty声明为您提供免费的实例变量 getter setter !表示法是您可以获得[self myInt];self.myInt;。这两个电话都是 100%等效,即他们都会调用方法- (int)myInt。默认情况下,此方法不可见(或者说,它不是显式实现,见下文),但是,您可以实现它以提供一些自定义逻辑(例如检查特定值,错误处理或延迟实例化) )。如果要覆盖它,请将其放在.m文件中。

- (int)myInt {
   NSLog(@"getter of my int called, current value %d", _myInt);
   return _myInt;
}

我只想添加以前的答案,在Objective-C中,您可以在声明属性时重命名您的getter和setter ,如下所示:

@property (getter=getMyInt) int myInt;

你可以用与使用你的男性吸气剂完全相同的方式打电话:

int myInt = [self getMyInt];
// or
int myInt = self.getMyInt; // (will work but is not recommended since the compiler will interpret this as calling the getter of a property named `getMyInt` and only when this one is not found will actually fall back to the custom getter (thx to @NikolaiRuhe again for pointing this out))

<强>更新 同意@NikolaiRuhe在评论中所说的大部分内容,这里是对我提到的答案的澄清:

  1. 这确实是一个错字,当然使用属性getter 的方法是调用[self myInt]或使用点符号self.myInt [self getMyInt]。然而,这些调用是100%等效的,因为它们都调用实际的getter。

  2. 关于可见性,确实我应该在这里更明确。在OOP术语中,可见性是一个概念,用于描述来自特定类外部的实例变量的可访问性。我的意思完全与@NikolaiRuhe建议的方式相同,即此方法不是显式实现的(因此,默认情况下,它不是在代码中可见)。对此误解感到抱歉!

  3. 我实际上不确定这一点。对我而言,这在过去没有太大的区别,我不坚持这一点。所以我很清楚显式实现 getter 的行为实际上不是覆盖而是替换合成方法

  4. 如上所述,在明确地将getter重命名为getMyInt之后,调用self.getMyInt时,我看不到任何“错误”。为什么这是访问该物业的错误方式?

答案 1 :(得分:0)

getter方法是:

[d myInt]; 

根据Apple docs

  

您可以通过访问者方法访问或设置对象的属性:

NSString *firstName = [somePerson firstName];
[somePerson setFirstName:@"Johnny"]; By default, these accessor methods are synthesized automatically for you by the compiler, so you
     

除了使用声明属性之外,不需要做任何其他事情   类接口中的@property。

     

合成的方法遵循特定的命名约定:

     

用于访问值的方法(getter方法)具有相同的方法   作为财产的名称。名为的属性的getter方法   firstName也将被称为firstName。

     

用于设置值的方法(setter方法)以   单词“set”然后使用大写属性名称。二传手   名为firstName的属性的方法将被称为setFirstName:。

答案 2 :(得分:0)

如果要在objective-c中创建属性,它会为您创建3件事。

  • 实例变量,您可以在属性名称前使用下划线进行访问。例如:_myint

  • getter方法,可以使用属性名称直接调用。例如:[self myint]; / self.myint,这实际上会调用- (int)myint {}方法。

  • setter方法,您可以在其前使用'set'关键字进行调用。例如:[self setMyint:12]; / self.myint = 12,这实际上会调用- (void)setMyint:(int)myint {}方法。

Source

所以当你写d.myint = 12;时,这相当于写[d setMyint:12];

当你写NSLog(@"The value is %d",d.myint);时,这相当于写NSLog(@"The value is %d",[d myint]);

自定义Getter和Setter

Credits

您还可以为您的属性Getters和Setters提供自定义名称。这就是它的完成方式

@property (getter=getMyInt, setter=setMyIntWithInt) int myint;

例如:

[d setMyIntWithInt:12]; //This will set the instance variable to 12.
NSLog(@"The value is %d",[d getMyInt]);

此外,您可以在实现(.m)文件中覆盖这些方法,以进行错误处理或延迟实例化。

答案 3 :(得分:0)

getter方法的语法是 -

-(int)myint{ return myInt; }

如果您收到此消息,即myInt,则会返回接收方的d属性。