在.h文件中声明实例变量和在@interface括号内声明.m之间的区别

时间:2014-05-22 08:16:51

标签: ios

如果某人可以在@interface括号内和.m文件@interface括号内的.h文件中声明实例变量。如下所示

@interface ViewController : UIViewController { NSString *str ; }

@interface ViewController () { NSString *anotherStr ; }

THX

3 个答案:

答案 0 :(得分:3)

甚至还有第三个位置可以定义实例变量:在实现声明中:

@implementation ViewController { NSString *yetAnotherString; }

AFAIK,在过去,您只能在主界面中定义实例变量。其他两个地方后来加了。你也可以混合它们(只要它们有不同的名称)。

@implementation定义变量以及类扩展@interface ViewController ()级别(在.m文件中完成)的优势在于,您可以隐藏API用户的实现详细信息。换句话说,如果有人读取他不知道变量的.h文件。这使得可见API更清晰,也是一个称为“信息隐藏”的概念,这在面向对象编程中非常重要:不要暴露太多的实现细节,这样就可以在不破坏使用类的代码的情况下更改实现。

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

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

答案 1 :(得分:1)

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

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

注意:请注意,这不应与@public@protected@private混淆,如下面提到的DarkDust。这将是另一个不同的主题。

答案 2 :(得分:0)

在Objective.C中,当您在.h文件中声明该成员时,当.h文件作为标题导入时,它将对另一个文件可见。

默认情况下,所有成员变量都是私有的。因此,用户无法直接使用它们。但是使用runtime.h和setValueForKey的方法为它们提供了另一种设置这些变量的方法。

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

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

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

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