2014-05-22 49 views

回答

3

甚至还有第三个地方,你可以定义实例变量:在执行语句:

@implementation ViewController { NSString *yetAnotherString; } 

AFAIK,在古时候,你可以只定义在主界面的实例变量。其他两个地方稍后添加。您也可以将它们混合(只要它们具有不同的名称)。

定义变量@implementation和类扩展@interface ViewController()级别(在.m文件中完成时)的优点是您可以隐藏API用户的实现细节。换句话说,如果有人读取.h文件,他不知道变量。这使得可见的API更清晰,并且也是一种名为“信息隐藏”的概念,这在面向对象编程中非常重要:不要公开太多的实现细节,因此您可以更改实现而不破坏使用该类的代码。

请注意,您也可以在所有三个级别定义IBOutlet变量,Interface Builder将检测并使用它们!

因此,当您决定在哪里定义变量时,您可以简单地问自己:其他人在看到.h文件时是否需要查看变量?恕我直言,这只有当你需要/想要使一个变量@public真实。对于所有其他情况,您可以在类扩展或实现级别定义它们以使API更清洁。

1

无论你在ViewControllerA.H声明是公共。这意味着包含ViewControllerA对象的其他视图控制器可以直接访问方法或变量。无论你在.M私有,其他视图控制器不能立即访问它。

至于我自己的做法,大部分变量(我没有使用太多)或我在.M中声明的属性,以防止其他视图控制器直接访问它。它就像面向对象编程 - 数据封装中的一个概念。

注:请提醒的是,这不应该与@public@protected@private像DarkDust下文提到的混淆。这将是另一个不同的话题。

+1

这几乎是我所做的。 +1 – CW0007007

+2

请注意,上下文中的“public”不会自动引用变量访问限制 - 默认情况下它们是“@ protected”,除非标记为“@ public”。 – DarkDust

+0

@DarkDust感谢您的提醒。我会在上面添加更多信息。 – Ricky

0

在您在.h文件中声明成员时,在Objective-C中,当.h文件导入为标头时,它对另一个文件变得可见。

默认情况下,所有成员变量都是私有的。所以,用户不能直接使用它们。但是使用runtime.h和setValueForKey方法给它们设置这些变量的替代方法。

为了避免用户做这样的恶作剧,建议在.m文件中声明你的私有变量。它们也被称为扩展。

例如,您在appdelegate文件中创建了一个变量。现在将appdelegate.h文件导入到其他.m文件。通过sharedApplication委托获取appdelegate的实例。现在您可以通过以下方式设置值。

[appdelegate setValue:your_value forKey:@"name of variable"]; 

虽然它是私人的,但用户可以这样做。这是因为当你检查自动建议窗口时,它会通过检查列出你的私有变量。为了避免在这个窗口中获取这些变量,建议在.m文件中声明它们。

+0

微调:默认情况下,实例变量是'@ protected'。 – DarkDust

相关问题