Objective C中的接口有什么意义?

时间:2012-06-01 19:28:46

标签: objective-c

我已经编写了Objective C近一年了,我从来没有机会使用接口( .h)用于其他目的,而不是声明几乎相同的类结构,你可以在实施( .m)。

由于我来自其他语言而没有Objective C接口这样的东西,我想知道是否有一些或几个我缺少的用法,或者这只是一种惯例,这种特定的语言可能从它的前辈继承。

谢谢!

5 个答案:

答案 0 :(得分:5)

您的界面是该类的公共API。无法从类外部访问界面中未声明的任何内容。如果您在C ++或Java方面考虑更多,那么.m文件中的所有内容(未在.h中的@interface中声明)都是私有的。这就是为什么你不会在Objective-C中经常看到关键字@private,@ public或@protected。

无论你在界面中放置什么,你打算让你的班级用户使用它,仅此而已。这遵循最小特权原则。

您还可以将@interface视为您班级的文档。

答案 1 :(得分:1)

  

我从来没有机会将接口(.h)用于另一个接口   目的而不是声明你能找到的几乎相同的类结构   在实施(.m)。

接口是该类的公开声明的接口。实现是如何尊重该接口。一个微不足道的例子:

@interface Accumulator: NSObject

- (void)addAmount:(NSUInteger)amount;

@property (nonatomic, assign, readonly) NSUInteger currentTotal;

@end

@implementation Accumulator
{
    NSUInteger currentTotal; // an instance variable; we don't want to publish
                             // these because they're nothing to do with the
                             // interface we implement. Object orientation means 
                             // not thinking about implementations beyond
                             // your own.
}

@synthesize currentTotal;

- (void)addAmount:(NSUInteger)amount
{
     currentTotal += amount;
}

@end

因此,作为一般指导原则,您未在@interface中添加的内容包括:

  • 实例变量;
  • 非供外部使用的方法;
  • 引用您依赖的其他课程,但依赖您的人员不需要了解。

答案 2 :(得分:0)

接口文件类似于C& C中使用的头文件。 C ++,只有在Objective C中,您还可以声明诸如propertiesprotocols之类的好东西(对于需要确认对象的接口期望如何传递消息的委托之类的东西非常有用)。

您的对象的接口文件可以包含在其他对象的实现(.m)文件中,这样那些其他对象的实现就可以访问方法&您刚刚实例化(创建)的对象的属性。

答案 3 :(得分:0)

它继承自C,其中包含定义接口的头文件和包含实现的源文件。这确实意味着一些双重进入。

例如,Java取消了这种双文件方法,并且只有一个包含所有内容的文件。它没有C的编译和链接阶段,这是标题原因的一部分。

标题方法的一个方面是,使用专有代码,您可以向某人提供您的标题以及已编译的二进制文件,并且可以链接到&打电话给你的API就好了。这就是微软使用Win32 API所做的事情,或Apple对其SDK和操作系统所做的事情。

另见Why have header files and .cpp files in C++?

答案 4 :(得分:0)

扩展已经说过的内容:基于C语言的编译器需要对.c / .cpp / .m文件中的单词有一定的了解才能在外部库或目标文件中进行链接。该信息告诉编译器诸如返回类型以及函数和方法的参数的数量和类型,以及类中的实例变量和方法。

如果您要在使用其功能的文件中实际包含整个.c / .cpp / .m文件,您最终会遇到一个问题,即链接器有重复的代码,它不知道如何处理;因此,头文件只列出了他们实际需要知道的关于接口的内容,而不是实现。

C和Objective-C实际上允许你省略各种各样的接口信息,但是如果他们看到提到他们没有读过的标题的函数或方法,他们就会做出(通常是不正确的)假设。例如,一个未知的函数名称将被正确识别,但编译器将假定它返回一个int;我的内存对于如何处理参数有点模糊,但如果你传递的参数与最终被链接的实现函数中的参数不兼容,它就不会抱怨。因此编译器无法进行大量的检查像C这样的静态语言很擅长。