客观c中的getter和setter方法?

时间:2012-09-28 14:15:47

标签: objective-c ios5 ios4

Objective-C的新手,我基本上来自c ++背景。我现在正在学习objective-c,并希望确认我所理解的是写或错?请建议。

我有以下课程:

@interface Test: NSObject
{
 int instance1; 
}
@property int instance1;
 - (void)  sayHello;
@end

Class'Test'有一个实例变量instance1。如果成员函数ie:sayHello想要访问变量,则必须通过getter / setter函数进行。所以,有两种方法可以实现它:

  1. 用户可以定义。
  2. 我们可以从编译器那里得到帮助吗?怎么样?。          声明与属性相同的变量,并将其合成,即编译器          为我们获取该特定变量的getter / setter代码。
  3. 所以,Untimately,getter / setter是在方法实现中访问变量的唯一方法,即。 self.instance1 = 100;instance1 = 100都需要getter / setter。

    错过了1.和2.,无法访问instance1变量。

    此外,instance1是一个公共变量,可以使用对象实例在类外部访问。

    Test *t = [[ Test alloc] init];
    t.instance1 = 200;
    

    问题:

    1. 有没有办法让instance1为“私有”,这样我就无法访问该实例 课外变量?
    2. 我的理解有什么不妥吗?

2 个答案:

答案 0 :(得分:1)

  

如果成员函数ie:sayHello想要访问变量,则必须通过getter / setter函数进行。

它没有have to。您可以直接访问ivars,而无需使用访问器方法:

- (void)sayHello {
   instance1 = 123;
}

您可以通过在实现文件中声明私有ivars来定义它们,而不是标题:

@implementation Test {
   int privateVar;
}
// ... additional implementation, methods etc.
@end

请注意,自Xcode 4.4起,您不必再声明您的ivars了。您只需声明一个属性。 ivar和accessor方法将自动合成。

有关详细信息,建议您阅读我对此问题的回答: Declaration of variables

答案 1 :(得分:1)

离子SomeDelegate.h

@interface SomeDelegate : NSWindowController {
@private
    int fLanguage;
    int fDBID;

    bool fEndEditingIsReturn;
@public
    int fIsMyLastMSG;  
}

@property int language;

在SomeDelegate.mm

@implementation SomeDelegate

@synthesize language=fLanguage;

在我的示例中,您获得了私有公共变量,私有变量fLanguage有一个property < em>合成访问器方法。