Все остальные ответы, похоже, были обнаружены неверным тегом, который теперь исправлен.
В 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
Редактировать
Извините, пропустил вторую часть. Там нет никаких преимуществ или недостатков как таковых. Это все равно, что спросить, в чем разница между временем и, если и каковы преимущества одного над другим. Это бессмысленно, потому что они предназначены для разных целей.
Наиболее распространенное использование методов класса - это получение экземпляра, когда он вам нужен. +alloc
- это метод класса, который дает вам новый неинициализированный экземпляр. NSString имеет множество методов класса, чтобы дать вам новые строки, например, + StringWithForma
Другое распространенное использование - получение синглтона, например
+(MyClass*) myUniqueObject
{
static MyUniqueObject* theObject = nil;
if (theObject == nil)
{
theObject = [[MyClass alloc] init];
}
return theObject;
}
Вышеуказанный метод также будет работать как метод экземпляра, поскольку объект Object является статическим. Тем не менее, семантика будет более понятной, если вы сделаете это методом класса, и вам не нужно сначала создавать экземпляр.