对于 Objective-C 方法,一般做法是将您希望公开的方法放在头文件的 @interface 部分,以便其他代码只能包含 .h 并知道如何与您的代码交互。基于顺序的“惰性声明”就像 C 中的函数一样工作——您不必必须声明方法原型,除非您有无法通过排序解决的依赖项,但您可以添加方法如果需要,可以在 @implementation 中创建原型。
所以是的,你在正确的轨道上。不要为继承的方法重复方法原型——编译器会在父类的头文件中找到它。委托方法可以定义为类别中的原型(附加到类上)并根据需要实现,但委托不需要提供方法原型,因为它已经定义。 (为了清楚起见,它仍然可以。)
由于您只是在学习 Objective-C,因此此答案的其余部分比您要求的要详细得多。你被警告了。 ;-)
当您静态键入一个变量(例如 MyClass* 而不是 id)时,当您尝试调用一个类没有宣传它实现的方法时,无论它是否实现,编译器都会警告您。如果你动态输入变量,编译器不会阻止你调用你喜欢的任何东西,而且如果你调用不存在的东西,你只会得到运行时错误。就语言而言,您可以在运行时调用类实现的任何方法而不会出错——没有办法限制谁可以调用方法。
就个人而言,我认为这实际上是一件好事。我们非常习惯于封装和保护我们的代码免受其他代码的影响,以至于我们有时将调用者视为狡猾的恶棍,而不是值得信赖的同事或客户。我发现以“你做你的工作,我做我的工作”的心态编写代码非常愉快,每个人都尊重界限并照顾自己的事情。你可能会说,Objective-C 的“态度”是一种社区信任,而不是严格执行。例如,我很乐意帮助任何来到我办公桌前的人,但如果有人在没有询问的情况下弄乱我的东西或移动东西,我会非常生气。精心设计的代码不一定是偏执狂或反社会的,它只需要很好地协同工作。 :-)
也就是说,构建界面的方法有很多,具体取决于您在向用户公开界面时想要/需要的粒度级别。您在公共标头中声明的任何方法本质上都是公平的游戏,任何人都可以使用。隐藏方法声明有点像锁住你的车或房子——它可能不会让每个人都被拒之门外,但是(1)它“让诚实的人保持诚实”,不会用他们不应该搞砸的东西来诱惑他们,以及(2 ) 任何确实进入的人肯定知道他们不应该这样做,并且不能真正抱怨负面后果。
以下是我用于文件命名的一些约定,以及每个文件中的内容 - 从底部的 .m 文件开始,每个文件都包含它上面的文件。 (使用严格的包含链可以防止出现重复符号警告等情况。)其中一些级别仅适用于较大的可重用组件,例如 Cocoa 框架。根据您的需要调整它们,并使用任何适合您的名称。
-
MyClass.h — 公共 API(应用程序编程接口)
-
MyClass_Private.h — 公司内部 SPI(系统编程接口)
-
MyClass_Internal.h — 项目内部 IPI(内部编程接口)
-
MyClass.m — 实现,通常是所有 API/SPI/IPI 声明
-
MyClass_Foo.m — 附加实现,例如类别
API 供所有人使用,并得到公开支持(通常在 Foo.framework/Headers 中)。 SPI 为您的代码的内部客户端公开了额外的功能,但要理解支持可能会受到限制并且接口可能会发生变化(通常在 Foo.framework/PrivateHeaders 中)。 IPI 包含特定于实现的细节,这些细节绝不应该在项目本身之外使用,而且这些头文件根本不包含在框架中。任何选择使用 SPI 和 IPI 调用的人都需要自担风险,并且通常会在更改破坏代码时损害他们的利益。 :-)