问答中心分类: OBJECT-C类方法和实例方法之间有什么区别?
0
匿名用户 提问 3月 前

类方法和实例方法之间有什么区别?
实例方法是访问器(getter和setter),而类方法几乎是其他所有方法吗?

18 Answers
0
Cory Kilger 回答 3月 前

像大多数其他答案所说的那样,实例方法使用类的实例,而类方法只能与类名一起使用。在目标C中,它们的定义如下:

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

然后可以这样使用它们:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

类方法的一些实际示例是许多基础类上的方便方法,如NSString+stringWithFormat:NSArray+arrayWithArray:. 实例方法是NSArray-count方法

Quinn Taylor 回复 3月 前

回答得好。还值得注意的是,您将看到用于描述方法的特定速记符号。例如,+[NSString stringWithFormat:]是类方法+stringWithFormat:on NSString-[NSArray objectAtIndex:]是一个实例方法。具有多个选择器部分的方法的编写方式类似于-[NSMutableDictionary setObject:forKey:]等。您经常在Cocoa响应、文档和Xcode中看到这种表示法。

Brian Pan 回复 3月 前

我想补充一点,在许多其他语言中,类方法被称为“静态”方法。为了回答最初的问题,访问器是实例方法,因为它们设置并获取特定实例的状态。在上面的示例中,NSArray count返回特定实例中的对象数。

user102008 回复 3月 前

“而类方法只能与类名一起使用。”或类对象

Pavan 回复 3月 前

对不起,我很激动。。。但我刚刚了解了其中的差异及其潜力。类方法非常棒,单例类也是如此!我已经坠入爱河了<3.

Sulthan 回复 3月 前

@BrianPan静态方法和类方法不同。它们很相似,但命名不同的原因是它们的工作方式不同。例如,不能重写静态方法。

0
Johannes Fahrenkrug 回答 3月 前

其他答案很好地涵盖了所有技术细节。我只想分享一个简单的类比,我认为它很好地说明了类和实例之间的区别:
在此处输入图像描述
A.就像蓝图关于房子:你只有一个蓝图,而且(通常)单凭蓝图做不了那么多。
在此处输入图像描述
例子(或object)是实际的房屋你可以根据蓝图建造很多房子。然后,可以在每个房屋中为墙绘制不同的颜色,就像可以独立更改类的每个实例的属性而不影响其他实例一样。

Shekhu 回复 3月 前

@JohannesFahrenkrug在这里很好地解释了类和对象的概念。这不是真正的问题difference between class method and an instance method;

Alex McPherson 回复 3月 前

类与类实例的完美解释。对于新手来说,类是一个奇怪的概念,这从最基本的角度解释了它。

ChenSmile 回复 3月 前

@约翰内斯法伦克鲁格(JohannesFahrenkrug)真是一个很好的解释,这让我思考如何区分两者以及何时使用两者

Praveenkumar 回复 3月 前

这么好的解释:)

GeneCode 回复 3月 前

很好的类比。请有人给这家伙一年的比萨饼供应量。

0
micmoo 回答 3月 前

就像其他答案所说的那样,实例方法操作对象并可以访问其实例变量,而类方法操作类作为一个整体,并且不能访问特定实例的变量(除非您将实例作为参数传入)。
类方法的一个很好的例子是计数器类型方法,它返回类的实例总数。类方法以+,而实例以-.

static int numberOfPeople = 0;

@interface MNPerson : NSObject {
     int age;  //instance variable
}

+ (int)population; //class method. Returns how many people have been made.
- (id)init; //instance. Constructs object, increments numberOfPeople by one.
- (int)age; //instance. returns the person age
@end

@implementation MNPerson
- (id)init{
    if (self = [super init]){
          numberOfPeople++;
          age = 0;
    }    
    return self;
}

+ (int)population{ 
     return numberOfPeople;
}

- (int)age{
     return age;
}

@end

主要的m:

MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);

输出:
另一个例子是,如果您有一个希望用户能够调用的方法,有时最好将其作为类方法。例如,如果有一个名为MathFunctions的类,则可以执行以下操作:

+ (int)square:(int)num{ 
      return num * num;
}

因此,用户将调用:

[MathFunctions square:34];

无需实例化类!
您还可以使用类函数返回自动释放的对象,如NSArray的

+ (NSArray *)arrayWithObject:(id)object

它接受一个对象,将其放入一个数组中,并返回一个数组的自动释放版本,该版本不需要内存管理,非常适合临时数组等等。
我希望您现在了解何时和/或为什么应该使用类方法!!

mobibob 回复 3月 前

Michoo,我建议你把“静态int numberOfPeople=0在代码格式的文本中?我很困惑,直到我在示例代码上方注意到它。除此之外,还有一个非常简洁的答案。

selytch 回复 3月 前

请原谅我的新手混淆,但为什么您需要实例变量“age”和实例方法“age”?实例变量“age”的getter和setter不是用@synthetize创建的吗?

micah94 回复 3月 前

@要使用synthetize,selytch“age”必须定义为属性。

0
Robert Horvick 回答 3月 前

实例方法应用于类的实例(即对象),而类方法应用于类本身。
在C#中,类方法被标记为静态。未标记为static的方法和属性是实例方法。

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
Robert Horvick 回复 3月 前

啊,对不起,我刚刚注意到这是一个Obj-C问题。希望我的答案仍然适用,但请投票反对或投票删除。

Quinn Taylor 回复 3月 前

没有造成伤害。答案的第一部分作为一般OOP原则是正确的,它肯定适用于Objective-C。如果您不想看到此类问题,可以将“Objective-C”添加到标记列表中以忽略,但欢迎任何人参与。:-)

0
hhafez 回答 3月 前

您的问题的答案并不特定于objective-c,但是在不同的语言中,类方法可以称为静态方法。
类方法和实例方法之间的区别是
类方法

  • 对类变量进行操作(它们无法访问实例变量)
  • 不需要实例化要应用的对象
  • 有时可能是一种代码气味(一些刚接触OOP的人将其作为在OO环境中进行结构化编程的支柱)

实例方法

  • 操作实例变量和类变量
  • 必须有实例对象才能对其进行操作