在.h文件和.m文件中声明方法之间的区别,指定@interface和@end

时间:2011-11-19 18:18:12

标签: iphone objective-c

我只是不明白为什么有些人在.m文件中声明方法。这些声明不能只是进入.h文件吗?这是我看到的主要内容:

//myClass.h

#import <UIKit/UIKit.h>

@interface myClass: UIViewController
{

}

@end

实施(.m)部分:

//myClass.m

#import "myClass.h"

@interface myClass

//declare some methods here

@end

@implementation myClass

//the actual implementation

@end

当方法以这种方式声明时有什么区别吗?另外,“@private”方法可以在myClass.h中声明,不是吗?

4 个答案:

答案 0 :(得分:5)

这是关于保持公共和私人接口之间的分离。

能够在实现文件中声明方法,属性和iVars是一个明确的指示,指示您可以在课堂上执行和使用的内容,以及可以从课外进行的操作。

您还可以重新声明属性。例如:

在.h

@property (readonly, copy) NSString *aString;
<。> in .m

@property (readwrite, copy) NSString *aString;

因此,在您的类中,您可以将该属性视为readwrite,但在外部,该属性是readonly。

答案 1 :(得分:4)

您发布的代码都不编译,并不等同于在标题中声明方法。

标题的目的是提供一组其他类可以导入的声明。他们无法导入您的实现文件,因为这将创建重复的定义。

正如bbum所说,你可能看到的是实现文件中的私有方法声明。这些不打算在类之外使用,因此它们在实现文件中声明。该功能称为类扩展:

//MyClass.h

#import <UIKit/UIKit.h>

@interface MyClass: UIViewController

// Declare methods that other classes should call here

@end

//MyClass.m

#import "MyClass.h"

@interface MyClass () // <--- NOTE THE PARENTHESES HERE

// Declare methods that only this class should be using here

@end

@implementation MyClass

// Define all your methods here

@end

不,你不能在标题或其他任何地方声明“@private方法”。 Objective-C中没有这样的东西。 @private访问说明符仅适用于变量。

答案 2 :(得分:2)

  • MyClass,而不是myClass;课程以大写字母开头。

如果该代码完全编译,我会感到惊讶。如果在.m中,你要说:

@interface MyClass()
@end

然后那是一个类扩展,已在SO上多次讨论过。事实上,你是为@interface声明一个有冲突的MyClass,编译器应该抱怨。

答案 3 :(得分:0)

我曾多次在.m文件中声明内部类(与主类不同地命名)。这些将是.m包含的主类使用的类(并且在.h中声明)。这样内部类就是“私有”,而且,在一个文件中,它在处理主类实现时更容易阅读和更新。