2014-01-25 124 views
0

我正在学习Objective C的过程。有些语法不同;我不明白为什么他们不得不重新发明事物,为他们提供帮助。Objective C - 类方法,实例方法

我想我有这个直。实例方法是您必须创建类的实例才能使用方法的方法。以负号进行。类方法是您不必创建类实例的方法。由加号加上。

那么编写一个你不打算用你可以使用的方法实例化的类是合适的吗?有点像你的程序的一般工具组?只要我遵守MVC方法。

+2

有趣的事实; Java以及其中的所有派生都直接受Objective-C的启发,相当直接地提升了许多设计模式。 – bbum

+0

如果你要创建一个只包含类方法但没有实例方法的类(因此不应该实例化),我建议标记'alloc','init'和'initWithZone:'方法'__attribute __((不可用(“这个类不能被实例化)));' – nhgrif

+1

语法是不同的,因为与C++不同,*所有*有效的C代码也是有效的Objective-C,并且相同的代码也是相同的Objective-C和C一样。为了使其成为可能,语法增加 - 类声明,方法声明,方法调用等 - 必须以某种方式进行限定,以免它们与现有的C语法冲突。因此所有的@,+ s,-s,[] s等等 相比之下,C++在很多方面与C完全不同,尽管名称和表面上相似的语法。 “类C语法”并不意味着“类C语言”。 – user2310967

回答

8

我正在学习Objective C的过程。有些相当不同的语法 ;我不明白为什么他们不得不重新发明事物,为他们提供帮助。

请记住,Objective-C最初创建于1983年,与C++同一年。所以,这不是一个真正的重塑,至少是你可能习惯的语言。事实上,它可能早于许多上述语言。 Objective-C很受Smalltalk的启发,但我认为你会发现Smalltalk的语法更加陌生!

实例方法是您必须创建一个 类的实例才能使用这些方法的方法。以负号进行。一个类的方法是 其中你不必创建一个类实例。加号 。

是的,你基本上是那样直。类声明/定义以'+'开头的类方法可以在类本身而不是类的实例上调用。在Objective-C中,类本身就是对象。类方法不能访问实例变量(因为它们不在实例上调用),但除此之外,它们是常规方法。实例方法只能在类的实例化实例上调用,并且可以访问该实例的内部状态(即它的实例变量)。

那么编写一个你不打算使用的方法是否合适 用你可以使用的方法实例化?

当然,这不是不合理的。不管这是一个好主意还是另一个问题。我认为很多时候使用常规函数而不是类方法更适合这类事情。类方法是通常用于方便的方法(如工厂方法),配置该类的所有实例的全局/默认行为,以及那种事情。