Как и в других ответах, методы экземпляра работают с объектом и имеют доступ к его переменным экземпляра, а метод класса работает с классом в целом и не имеет доступа к переменным конкретного экземпляра (если вы не передаете экземпляр в качестве параметра).
Хорошим примером метода класса является метод счетного типа, который возвращает общее количество экземпляров класса. Методы класса начинаются с +
, а методы экземпляра начинаются с -
.
Например:
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
Это берет объект, помещает его в массив и возвращает автоматически выпущенную версию массива, которая не должна управляться памятью, отлично подходит для временных массивов, а что нет.
Надеюсь, теперь вы понимаете, когда и / или почему вы должны использовать методы класса !!