Objective-C使用点符号对合成属性ivars

时间:2011-05-25 15:24:32

标签: objective-c syntax properties

所以,假设我有 UITextField 的综合属性,我将其命名为 field1 。根据我的理解,您应该使用 self.field1 = newValue 来更改field1值。通过使用点表示法,您可以自动使用编译器创建的setter。 (或者使用它而不用点符号 [self setField1:newValue]

但我已经看过他们使用相同的点符号方法设置field1的ivars的例子:

field1.text = @"Text";

这是否意味着在声明属性时,您可以在所有属性的ivars上自动使用点表示法?或者这是否可能只是因为在UITextField类中,ivar“text”被声明为属性?假设文本未被声明为属性,则将文本设置为正确的方式为:

[field1 setText:@"Text"]

5 个答案:

答案 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会返回UITextFieldtext是该文本字段的属性名称。


在回复您的评论时,self.field1访问了该属性,field1是ivar。我上面给出的例子完全等同于:

[[self field1] setText:@"test"];

任何一个都可以使用,但您通常希望使用以下属性访问器:self.field1.text