Objective c 什么';目标C中接口的要点是什么?

Objective c 什么';目标C中接口的要点是什么?,objective-c,Objective C,我编写Objective C已经快一年了,除了声明在实现(.m)中可以找到的几乎相同的类结构之外,我从来没有机会将接口(.h)用于其他目的 由于我来自其他语言,没有像Objective C接口这样的东西,我想知道我是否遗漏了一些或几种用法,或者这只是一种惯例,这种特定语言可能是从它的前身继承下来的 谢谢 > P>接口文件类似于C+C++中使用的头文件,只有在目标C中,您还可以声明和(对于需要确认对象的接口如何期望传递消息的委托的超级有用的东西)。 您的对象的接口文件可以包含在其他对象的实现(.m

我编写Objective C已经快一年了,除了声明在实现(.m)中可以找到的几乎相同的类结构之外,我从来没有机会将接口(.h)用于其他目的

由于我来自其他语言,没有像Objective C接口这样的东西,我想知道我是否遗漏了一些或几种用法,或者这只是一种惯例,这种特定语言可能是从它的前身继承下来的


谢谢

> P>接口文件类似于C+C++中使用的头文件,只有在目标C中,您还可以声明和(对于需要确认对象的接口如何期望传递消息的委托的超级有用的东西)。
您的对象的接口文件可以包含在其他对象的实现(.m)文件中,这样其他对象的实现就可以访问您刚刚实例化(创建)的对象的方法和属性。

您的接口是该类的公共API。接口中未声明的任何内容都不能从类外部访问。如果你想更多的C++或java,那么.m文件中的所有内容(在.h接口中没有声明)是私有的。这就是为什么在Objective-C中你不会经常看到它们的关键字@private、@public或@protected

无论您在界面中放置了什么,都是您打算让类的用户使用的,仅此而已。这符合最低特权原则

您还可以将@interface视为类的文档

我从未有机会将接口(.h)用于其他应用程序 比声明几乎相同的类结构,您可以找到 在实现(.m)中

接口是类的公开声明接口。实现就是如何尊重这个接口。一个简单的例子:

@interface Accumulator: NSObject

- (void)addAmount:(NSUInteger)amount;

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

@end
以及:

因此,作为一般指导原则,您没有将以下内容放入@接口:

  • 实例变量
  • 非外用方法
  • 引用您所依赖的其他类,但依赖您的人不需要了解这些类

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

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

头方法的一个方面是,使用专有代码,您可以将头和编译的二进制文件一起提供给某人,他们可以链接并调用您的API。这就是微软用Win32 API所做的,或者苹果用他们的SDK和操作系统所做的


另请参见

以扩展前面所说的内容:基于C的语言编译器需要一定数量的关于.C/.cpp/.m文件中单词的知识,然后才能在外部库或对象文件中进行链接。这些信息告诉编译器返回类型、函数和方法的参数数量和类型,以及类中的实例变量和方法

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


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

用于包含在其他文件中,以便其他文件不需要处理实现。Objective-C最近变得非常神奇,但在幕后,类基本上是一个结构声明,接口告诉编译器数据结构有多大。是的,但是记住在objective-c中没有真正“私有”的东西。找到你的私有API并利用它们并不困难。从技术上讲,接口中没有声明的东西是可以访问的——例如,你可以向任何对象发送任何选择器,不管它的@interface声明了什么——你只会意识到你在做不负责任的黑客行为。没错,Objective-C更多的是基于这样一个理念,即用户知道他们在做什么,因此应该有访问权限,如果您使用respondstoSelector或Inspection之类的工具,那么您应该知道自己在做什么。谢谢Tommy,这是一个很好的说明性的回答。Tommy在这里非常专注于使用。我想补充一些关于这个类结构的原因的话:它似乎是Objective C的老版本。在创建它的时候(80年代),内存太贵了,无法让链接器浏览到一个类的所有函数。一种更简单的方法是使用带有该类声明的头文件,并让链接器从此处开始工作。(来自Wikipedia:)一些较新的语言使用命名方案,允许编译器定位与接口和类实现关联的源文件。很好的链接,特别是这个答案:似乎有密钥。
@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