当我在编程中使用实例方法和类方法时,我总是很困惑。请告诉我实例方法和类方法之间的区别以及彼此的优点。
答案 0 :(得分:11)
所有其他答案似乎都被现已修复的错误标记所捕获。
在Objective-C中,实例方法是在将消息发送到类的实例时调用的方法。所以,例如:
id foo = [[MyClass alloc] init];
[foo someMethod];
// ^^^^^^^^^^ This message invokes an instance method.
在Objective-C中,类本身就是对象,而类方法只是在将消息发送到类对象时调用的方法。即。
[MyClass someMethod];
// ^^^^^^^^^^ This message invokes a class method.
请注意,在上面的示例中,选择器是相同的,但是因为在一种情况下它被发送到MyClass的实例,而在另一种情况下它被发送到MyClass,所以调用了不同的方法。在接口声明中,您可能会看到:
@interface MyClass : NSObject
{
}
+(id) someMethod; // declaration of class method
-(id) someMethod; // declaration of instance method
@end
并在实施中
@implementation MyClass
+(id) someMethod
{
// Here self is the class object
}
-(id) someMethod
{
// here self is an instance of the class
}
@end
修改强>
对不起,错过了第二部分。这样没有优点或缺点。这就像询问while和if之间的区别是什么,以及有什么优势。它有点无意义,因为它们是为不同的目的而设计的。
类方法的最常见用法是在需要时获取实例。 +alloc
是一个类方法,它为您提供了一个新的未初始化实例。 NSString有很多类方法可以为你提供新的字符串,例如+ stringWithForma
另一个常见用途是获得单身,例如
+(MyClass*) myUniqueObject
{
static MyUniqueObject* theObject = nil;
if (theObject == nil)
{
theObject = [[MyClass alloc] init];
}
return theObject;
}
上述方法也可以作为实例方法,因为Object是静态的。但是,如果您将其设置为类方法并且不必首先创建实例,则语义会更清晰。
答案 1 :(得分:4)
如果我们不想创建类的对象,那么我们使用类方法 如果我们想通过类的对象调用方法,那么我们使用实例方法
答案 2 :(得分:1)
我不知道我们是否可以谈论任何优势,这只是你正在实施的问题。
实例方法适用于类的实例,因此需要应用对象并可以访问其调用者的成员:
Foo bar;
bar.instanceMethod();
另一方面,类方法适用于整个类,它们不依赖于任何对象:
Foo::classMethod();
答案 3 :(得分:0)
静态成员函数非正式地称为类方法(错误地)。在C ++中没有方法,有成员函数。
答案 4 :(得分:0)
阅读静态关键字,这几乎涵盖了它。
MSDN: http://msdn.microsoft.com/en-us/library/s1sb61xd.aspx
Google搜索: http://www.google.ch/search?aq=f&sourceid=chrome&ie=UTF-8&q=static+keyword+c%2B%2B
答案 5 :(得分:0)
类方法与类一起使用,但实例方法与该类的对象一起使用,即实例
//Class method example
className *objectName = [[className alloc]init];
[objectName methodName];
//Instance method example
[className methodName];
答案 6 :(得分:0)
实例方法使用类的实例,而类方法只能使用类名。在类方法之前使用+符号,其中在实例变量之前使用单个desh( - )。
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
它们也可以这样使用,
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
或另一个例子是:
[
NSString string]; //class method
NSString *mystring = [NSString alloc]init];
[mystring changeText]; //instance Method
答案 7 :(得分:0)
与大多数其他答案一样,实例方法使用类的实例,而类方法只能使用类名。在Objective-C中,它们被定义为:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
然后可以这样使用它们:
// class methods must be called on the class itself
[MyClass aClassMethod];
// instance method require an instance of the class
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
类方法的一些真实世界示例是许多Foundation类的便捷方法,例如NSString
的{{1}}或+stringWithFormat:
的{{1}}。实例方法是NSArray
的{{1}}方法。