所以,假设我有 UITextField 的综合属性,我将其命名为 field1 。根据我的理解,您应该使用 self.field1 = newValue 来更改field1值。通过使用点表示法,您可以自动使用编译器创建的setter。 (或者使用它而不用点符号 [self setField1:newValue] )
但我已经看过他们使用相同的点符号方法设置field1的ivars的例子:
field1.text = @"Text";
这是否意味着在声明属性时,您可以在所有属性的ivars上自动使用点表示法?或者这是否可能只是因为在UITextField类中,ivar“text”被声明为属性?假设文本未被声明为属性,则将文本设置为正确的方式为:
[field1 setText:@"Text"]
答案 0 :(得分:20)
假设:
@interface Foo:NSObject
{
int bar;
}
@property int age;
- (int)bar;
- (void)setBar:(int)anInt;
@end
@implementation Foo
@synthesize age;
- (int)bar { return bar; }
- (void)setBar:(int)anInt { bar = anInt; }
@end
你可以:
- (void)makeMyFunkThePFunk
{
Foo *foo = [Foo new];
foo.bar = 5;
[foo setBar: 42];
[foo setAge: 29];
foo.age = 42;
[foo setAge: foo.bar];
[foo setBar: foo.age];
}
@property只不过是一种更容易声明setter / getter方法的语法,包括实例变量和实现方法的自动合成,如果需要的话。
点语法是方法调用的简写。任何“点”表达式都可以转换为等效的方法调用,使用点语法不需要@property声明。
答案 1 :(得分:2)
或者这是否可能只是因为在UITextField类中,ivar“text”被声明为属性?
这是对的。您可以在声明为属性的任何内容上使用点表示法。
答案 2 :(得分:2)
field1.text = @"Text";
和
[field1 setText:@"Text"]
是等价的,你可以期待它们,但如果属性的定义不同,field1.text
几乎可以调用任何方法:@property(getter=someOtherMethod)NSString * text;
答案 3 :(得分:1)
属性声明不会自动应用于ivars的组件。
在您的示例中,
field1.text = @"Text";
text
也在UITextField
中声明为属性。这就是你可以这样使用它的原因。
答案 4 :(得分:0)
您可以使用点表示法访问属性的属性。
self.field1.text = @"test";
没有什么特别的事情发生。 self.field1
会返回UITextField
。 text
是该文本字段的属性名称。
在回复您的评论时,self.field1
访问了该属性,field1
是ivar。我上面给出的例子完全等同于:
[[self field1] setText:@"test"];
任何一个都可以使用,但您通常希望使用以下属性访问器:self.field1.text