Разница между методами класса и экземплярами? - PullRequest
1 голос
/ 07 декабря 2010

Меня всегда смущает, когда я использую метод экземпляра и метод класса в программировании. Пожалуйста, расскажите мне разницу между методом экземпляра и методами класса и преимуществами друг друга.

Ответы [ 8 ]

11 голосов
/ 07 декабря 2010

Все остальные ответы, похоже, были обнаружены неверным тегом, который теперь исправлен.

В 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 является статическим. Тем не менее, семантика будет более понятной, если вы сделаете это методом класса, и вам не нужно сначала создавать экземпляр.

4 голосов
/ 25 января 2011

Если мы не хотим создавать объект класса, тогда мы используем метод класса если мы хотим вызвать метод через объект класса, тогда мы используем метод экземпляра

1 голос
/ 07 декабря 2010

Я не знаю, можем ли мы говорить о каком-либо преимуществе, это скорее вопрос того, что вы реализуете.

Методы экземпляра применяются к экземплярам классов, поэтому им нужен объект, к которому нужно применить объект, и они могут получить доступ к членам вызывающего:они не зависят ни от какого объекта:

Foo::classMethod();
0 голосов
/ 15 июля 2014

Как говорилось в большинстве других ответов, методы экземпляра используют экземпляр класса, тогда как метод класса может использоваться только с именем класса. В 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];

Некоторыми реальными примерами методов класса являются удобные методы для многих базовых классов, таких как NSString +stringWithFormat: или NSArray * +arrayWithArray: Метод экземпляра будет NSArray -count метод.

0 голосов
/ 18 ноября 2012

методы экземпляра используют экземпляр класса, тогда как метод класса может использоваться только с именем класса.Знак + используется перед методом класса, где перед переменной экземпляра используется одиночный символ (-).

@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
0 голосов
/ 11 августа 2012

Методы класса используются с классами, но методы экземпляра используются с объектами этого класса, т.е. экземпляр

//Class method example
className *objectName = [[className alloc]init]; 
[objectName methodName];

//Instance method example
[className methodName];
0 голосов
/ 07 декабря 2010

Читайте о статическом ключевом слове, которое в значительной степени охватывает его.

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

0 голосов
/ 07 декабря 2010

Статические функции-члены неофициально называются классами , методами (неправильно).В C ++ нет методов , есть функции-члены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...