类方法和实例方法有什么区别?
实例方法是访问器(获取器和设置器),而类方法基本上包括其他所有内容吗?
类方法和实例方法有什么区别?
实例方法是访问器(获取器和设置器),而类方法基本上包括其他所有内容吗?
就像其他大多数答案所说的那样,实例方法使用类的一个实例,而类方法可以仅使用类名。在Objective-C中定义它们如下:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
然后它们可以像这样使用:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
一些现实世界中类方法的例子是Foundation类中的便捷方法,如NSString的+stringWithFormat:或NSArray的+arrayWithArray:。实例方法将是NSArray的-count方法。
像其他答案所说的那样,实例方法作用于一个对象并且可以访问其实例变量,而类方法作用于整个类,且没有访问特定实例变量的权限(除非您将该实例作为参数传递)。
一个很好的类方法示例是计数器类型的方法,它返回类的实例总数。类方法以+
开头,而实例方法以-
开头。
例如:
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
main.m:
MNPerson *micmoo = [[MNPerson alloc] init];
MNPerson *jon = [[MNPerson alloc] init];
NSLog(@"Age: %d",[micmoo age]);
NSLog(@"%Number Of people: %d",[MNPerson population]);
输出: 年龄:0 人数:2
另一个例子是,如果你有一个希望用户能够调用的方法,有时将其定义为类方法是很好的选择。例如,如果你有一个名为MathFunctions的类,你可以这样做:
+ (int)square:(int)num{
return num * num;
}
那么用户将会调用:
[MathFunctions square:34];
而无需实例化该类!
您还可以使用类函数返回自动释放的对象,例如NSArray的
+ (NSArray *)arrayWithObject:(id)object
这个方法接收一个对象,将其放入数组中,并返回一个自动释放的版本的数组,不需要进行内存管理,非常适用于临时数组等情况。
我希望你现在了解何时和/或为什么应该使用类方法!
实例方法适用于类的实例(即对象),而类方法适用于类本身。
在C#中,类方法被标记为静态的。未标记为静态的方法和属性是实例方法。
class Foo {
public static void ClassMethod() { ... }
public void InstanceMethod() { ... }
}
你问题的答案并不特定于objective-c语言,然而在不同的编程语言中,类方法也可以被称为静态方法。
类方法和实例方法之间的区别是:
类方法
实例方法
我认为理解这个问题的最好方式是看一下alloc
和init
。正是这个解释让我理解了它们之间的区别。
类方法
类方法应用于整个类。如果您查看alloc
方法,那么在方法声明之前的+
表示这是一个类方法。这是一个类方法,因为它应用于类来创建该类的特定实例。
实例方法
您使用实例方法来修改该类的特定实例,而不是修改整个类。例如,init
(在方法声明之前用-
表示)是一个实例方法,因为您通常会在使用alloc
创建该类之后修改该类的属性。
示例
NSString *myString = [NSString alloc];
你正在调用类方法alloc
来生成该类的实例。注意消息的接收者是一个类。[myString initWithFormat:@"Hope this answer helps someone"];
您正在修改名为myString
的NSString
实例,通过在该实例上设置一些属性。请注意,消息的接收者是一个实例(类NSString
的对象)。alloc
为对象分配足够的内存,init
将修改那些内存地址中的内容以定义对象的状态。除非有空间可以修改对象,否则我们无法修改对象,因此我们在类上使用alloc
,它将决定为我们提供该空间。 - Adam Waite类方法通常用于创建该类的实例。
例如,[NSString stringWithFormat:@"SomeParameter"];
返回一个带有发送给它的参数的 NSString
实例。因此,由于它是返回其类型对象的类方法,它也被称为便利方法。
class
方法不需要你分配该对象的实例来使用/处理它。一个class
方法是自包含的,可以独立于任何类的对象状态而运行。一个class
方法应该为它所有的工作分配内存,并在完成后进行释放,因为该类的任何实例都无法释放前面调用类方法时分配的任何内存。instance
方法则完全相反。除非你分配该类的一个实例,否则你无法调用它。就像一个普通的类,它有一个构造函数并且可以有一个析构函数(清理所有分配的内存)。class
变量。实例方法操作类的实例(即“对象”)。类方法与类相关联(大多数语言使用关键字 static
来表示这些方法)。
@interface MyClass : NSObject
// instance method
- (void) instanceMethod;
+ (void) classMethod;
@end
类方法
还是实例方法
。MyClass
中声明。
实例方法
需要类的一个实例:MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];
在MyClass
内部,其他方法可以使用self
调用MyClass
的实例方法:
-(void) someMethod
{
[self instanceMethod];
}
但是,类方法
必须在类本身上调用:
[MyClass classMethod];
或者:
MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];
这不会起作用:
// Error
[myClass classMethod];
// Error
[self classMethod];