1

Objective-C 的新手,我基本上来自 c++ 背景。我现在正在学习objective-c,并想确认我理解的是写还是错?好心提醒。

我有以下课程:

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

“测试”类有一个实例变量instance1。如果成员函数 ie: sayHello 想要访问变量,它必须通过 getter/setter 函数发生。所以,有两种方法可以得到它:

  1. 用户可以定义。
  2. 我们可以从编译器那里得到帮助吗?如何?。将相同的变量声明为属性,并对其进行合成,编译器为我们获取该特定变量的 getter/setter 代码。

所以,不合时宜地,getter/setter 是在方法实现中访问变量的唯一方法,即。两者都self.instance1 = 100;需要instance1 = 100getter/setter。

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

此外,instance1公共变量可以在具有对象实例的类之外访问。

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

问题:

  1. 有什么办法可以使instance1“私有”,使我无法访问类外的实例变量?
  2. 我的理解有什么问题吗?
4

2 回答 2

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 和访问器方法将自动合成。

有关更多详细信息,我建议阅读我对这个问题的回答: 变量声明

于 2012-09-28T14:21:19.730 回答
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用于合成访问器方法

于 2012-09-28T14:45:36.720 回答