0

如果我们有:

第一种方法是

我的类.h

@interface MyClass : UIViewController{   

    IBOutlet UILabel* _label;  
    NSString    *myString; 
}

第二种方式是

MyClass.m

@interface MyClass() {

    IBOutlet UILabel* _label;  
    NSString    *myString;
}

@end

我的问题是第一种方式和第二种方式有什么区别。

我知道第二种方法是为 MyClass 创建私有变量。第一种方式怎么样。它是否做同样的事情。

请就这个问题给我建议

4

3 回答 3

1

第一种方式是在头文件 MyClass.h 中声明它的方式。使用这个类的人总是有你的头文件,所以他们会看到那些实例变量。

在实现文件 MyClass.m 中使用它的第二种方式。所以如果你给我一个框架,里面有你的类,只有 .h 文件,我可以使用你的 MyClass 类,但我不知道你的实例变量。

于 2012-04-17T14:12:05.677 回答
1

您可以使用@private关键字将第一个示例中的变量设为私有。这不是在类扩展中添加变量的重点。相反,在扩展中添加 ivars 可以让您从标头中删除不需要的依赖项,而无需使用前向声明。

例如,如果MySpecialClass在中定义MySpecialClass.h并且您想将其添加MySpecialClass *special为私有变量,则在标头中执行此操作将需要前向声明@class MySpecialClass,或者MySpecialClass.h在您自己的标头中包含标头。另一方面,将变量添加到扩展(您的第二种方式)可以让您包含MySpecialClass.h在您的实现.m 文件中,避免前向声明的混乱和不必要的头文件依赖。

于 2012-04-17T14:13:31.923 回答
1

两者中,第二种方式更好。第一种方法要求您将内部实现细节放在类的公共接口中,即它通过将这些细节泄露给类的用户来破坏封装。

但是,现在有第三种更好的方法。您可以将实例变量放入实现中:

@implementation MyClass
{
@private
    IBOutlet UILabel* _label;  
    NSString    *myString;    
}

// method implementations

@end
于 2012-04-17T14:17:56.960 回答