我什么时候定义objective-c方法?
我正在学习Objective-C,并有一个C / C ++的背景。
-
在面向对象的C ++中,在定义(实现)它之前,你总是需要声明你的方法,即使它是在父类中声明的。
-
在程序风格的C,IIRC中,只要定义一个函数,只要从文件中稍后出现的同一个编译单元(即同一个文件)中的其他东西中调用,就可以避开(好吧,提供你不用“extern”在其他地方声明)。
-
现在,在Objective-C中,看起来只需要在头文件中声明select器,如果它们将被外部使用,并且可以在.m文件中构造select器就好,然后调用它们.m文件。 此外,似乎委托方法或inheritance方法从不(重新)定义。
我在正确的轨道上? 什么时候需要在Objective-C中定义一个select器?
对于Objective-C方法,一般的做法是把你想要公开的方法放在头文件的@interface
部分,这样其他的代码就可以只包含.h并且知道如何与你的代码进行交互。 基于顺序的“懒惰声明”就像C中的函数一样工作 – 除非有一个无法通过sorting来解决的依赖关系,否则不必声明方法原型,但是如果需要的话,您可以在@implementation
添加方法原型。
所以是的,你是在正确的轨道上。 不要重复inheritance方法的方法原型 – 编译器在父级的头文件中find它。 委托方法可以定义为类别中的原型(添加到类中)并按需要实现,但委托不需要提供方法原型,因为它已经被定义。 (如果为了清晰起见,还是可以的)
由于你只是学习Objective-C,这个答案的其余部分比你所要求的更详细。 你被警告了。 😉
当你静态地input一个variables(比如MyClass*
而不是id
)时,编译器会在你试图调用一个类不会做广告的方法时发出警告,不pipe它是否执行。 如果你dynamic地inputvariables,编译器不会阻止你调用你喜欢的任何东西,而且如果调用一些不存在的东西,你将只会得到运行时错误。 就语言而言,您可以调用任何类在运行时没有错误的方法 – 没有办法限制谁可以调用方法。
我个人认为这实际上是一件好事。 我们习惯于封装代码,并将代码从其他代码中保护起来,我们有时会把调用者视为一个狡猾的歹徒,而不是一个值得信赖的同事或客户。 我觉得用一种“你做你的工作,我做我的”的心态编写代码是相当愉快的,每个人都尊重边界,照顾自己的事情。 你可能会说Objective-C的“态度”是社区信任,而不是严格的执行。 例如,我很乐意帮助任何来到我办公桌上的人,但是如果有人把我的东西搞乱了,或者没有提问,就会感到非常恼火。 精心devise的代码不一定是偏执或反社会的,它只需要一起工作。 🙂
也就是说,构build接口的方法很多,具体取决于将接口展示给用户需要的粒度级别。 你公开的头文件中声明的任何方法都是公平的游戏,任何人都可以使用。 隐藏方法声明有点像locking你的汽车或房子 – 它可能不会阻止每个人都出去,但是(1)通过不吸引他们不应该被搞乱的东西来“保持诚实的人” )任何进入的人肯定知道他们不应该,也不能抱怨负面的后果。
下面是我用来命名文件的一些约定,以及每个文件的内容 – 从底部的一个.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为您的代码的内部客户端公开了额外的function,但是了解到支持可能会受到限制,并且接口可能会更改(通常在Foo.framework/PrivateHeaders
)。 IPI由专门的实现细节组成,不应该在项目本身之外使用,这些头文件根本不包含在框架中。 任何select使用SPI和IPI呼叫的人都要冒自己的风险,而且当变更破坏他们的代码时通常是不利的。 🙂
在头文件中声明方法只会停止编译器警告。 Objective-C是一种dynamic语言,所以你可以调用一个方法(发送消息)给一个对象,不pipe这个方法是否是外部声明的。
另外,如果你在调用它的任何代码之上的.m文件中定义一个方法(懒惰的声明),那么它将不会产生任何警告。 然而,同样的事情适用,你可以发送一个消息给一个对象而不被声明。
当然,这意味着Objective-C中没有私有方法。 任何类实现的方法都可以调用。
个人喜好。 如果是公共的方法(即外部使用的方法)。 在.h中声明并在.m中定义。 如果要限制其可见性,或至less指出它是私有方法,请在.m文件中使用类别/类别扩展名 。 尽pipe很多示例代码使用惰性声明方法。
Objective-C将函数当作“消息”来处理,因此可以向任何对象发送一个“消息”,即使它没有在接口中明确声明它可以接受。 因此,Obj-C中没有私人成员这样的事情。
这可能是非常强大的,但是对于新的Obj-C程序员来说,尤其是那些来自C ++,Java或C#的程序员来说,这是一个混乱的来源。 这里是基本的经验法则:
- 您应该在@interface中定义所有公共方法,以便消费者知道您希望处理的消息。
- 您应该在@interface中定义@private方法以避免编译器消息,并避免必须在@implementation中sorting方法。
- 在为您的课程实施特定的方法惯例时,您应该使用协议。
这很大程度上是个人偏好,但它有助于避免令人讨厌的编译器警告,并保持您的代码组织。 并且容易理解。