我试图了解使用属性时生成的方法。 说我有以下声明
@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
但是不可用?如果我可能在这里遗漏了什么建议吗?
答案 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在评论中所说的大部分内容,这里是对我提到的答案的澄清:
这确实是一个错字,当然使用属性getter 的方法是调用[self myInt]
或使用点符号self.myInt
和不 [self getMyInt]
。然而,这些调用是100%等效的,因为它们都调用实际的getter。
关于可见性,确实我应该在这里更明确。在OOP术语中,可见性是一个概念,用于描述来自特定类外部的实例变量的可访问性。我的意思完全与@NikolaiRuhe建议的方式相同,即此方法不是显式实现的(因此,默认情况下,它不是在代码中可见)。对此误解感到抱歉!
我实际上不确定这一点。对我而言,这在过去没有太大的区别,我不坚持这一点。所以我很清楚显式实现 getter 的行为实际上不是覆盖而是替换合成方法
如上所述,在明确地将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 {}
方法。
所以当你写d.myint = 12;
时,这相当于写[d setMyint:12];
当你写NSLog(@"The value is %d",d.myint);
时,这相当于写NSLog(@"The value is %d",[d myint]);
自定义Getter和Setter
您还可以为您的属性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
属性。