我通常知道,当你想调用另一个对象的方法时,你会这样做:
NewObject *object = [NewObject alloc]init];
[object callMethod];
但是我创建了一个本身不是对象的类,这意味着它没有属性或内存管理。它有几种计算一些东西的方法。
从任何其他类中,我所要做的就是导入该类的标头并执行以下操作:
#import "MyClass.h"
[MyClass callMethod];
为什么在这种情况下我不必分配 init?它工作得很好。
我通常知道,当你想调用另一个对象的方法时,你会这样做:
NewObject *object = [NewObject alloc]init];
[object callMethod];
但是我创建了一个本身不是对象的类,这意味着它没有属性或内存管理。它有几种计算一些东西的方法。
从任何其他类中,我所要做的就是导入该类的标头并执行以下操作:
#import "MyClass.h"
[MyClass callMethod];
为什么在这种情况下我不必分配 init?它工作得很好。
因为你正在调用一个类方法。你只需要alloc init
对象。类只需要包含但不需要alloc init
编辑。所以你不需要启动一个NSString
类,比如说。
编辑:
让我们举一些无意义的例子:
+ (void)classMethod {
NSLog("Hi!");
}
[SomeClass classMethod]; // prints Hi!
- (void)instanceMethod { // (say it's an instance method of NSString)
NSLog(self);
}
[@"someNSString" instanceMethod]; // prints someNSString. But you need to have a string first, otherwise you cannot use this method.
听起来您正在尝试调用类方法。这些方法被定义为:
代替
加号表示该方法不使用任何字段,因此不需要实例化对象。
在您的示例中,“object”是已分配内存并初始化的类“NewObject”的实例。其中 - 作为您的示例,“MyClass”只是一个类,因为它具有如上所述声明的静态成员,因此不需要实例化。
类方法提供了一种将一堆相关函数组合到一个位置的好方法,而不是将它们分散在常规命名空间中,就像通常在直接 C 中所做的那样。您还可以同时拥有类方法和实例方法类,在需要时使用类,并在需要时实例化类以使用实例类。
编辑:更改术语以引用类方法而不是静态方法。
There is a difference between "instance" methods (normal ones), that have to be called on an object and have access to self
, and "class" methods (called static, in many programming languages), that are invoked on the class and thus do not have a self
.
类方法类似于 C++ 静态方法,因为它们可以在不创建类的具体实例的情况下被调用。这样做的用处是您可以调用类的专用工厂方法来创建新实例;或者,您可以在可能会或可能不会根据任务提供具体实例的类的范围内定义实用程序库。
看看 NSDate 和 NSNumber 是 Foundation 框架中很好的例子。