В чем разница между методами класса и экземпляра? - PullRequest
437 голосов
/ 28 июня 2009

В чем разница между методом класса и методом экземпляра?

Являются ли методы экземпляра средствами доступа (получателями и установщиками), в то время как методы класса являются почти всем остальным?

Ответы [ 18 ]

3 голосов
/ 07 ноября 2012

методы класса

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

Методы экземпляра

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

3 голосов
/ 23 января 2016

МЕТОДЫ КЛАССА


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


МЕТОДЫ ИНСТАНЦИИ


Метод экземпляра работает с конкретным экземпляром класса. Например, реализованный вами метод доступа - это все методы экземпляра. Вы используете их для установки или получения переменных экземпляра определенного объекта.


ВЫЗОВ


Чтобы вызвать метод экземпляра, вы отправляете сообщение экземпляру класса.

Чтобы вызвать метод класса, вы отправляете сообщение классу напрямую.


Источник: IOS - Objective-C - Методы класса и методы экземпляра

3 голосов
/ 04 февраля 2015

В Objective-C все методы начинаются с символа «-» или «+». Пример:

@interface MyClass : NSObject
// instance method
- (void) instanceMethod;

+ (void) classMethod;
@end

Символы «+» и «-» указывают, является ли метод class method или instance method соответственно.

Разница будет ясна, если мы вызовем эти методы. Здесь методы объявлены в MyClass.

instance method требуется экземпляр класса:

MyClass* myClass = [[MyClass alloc] init];
[myClass instanceMethod];

Внутри MyClass другие методы могут вызывать методы экземпляра MyClass, используя self:

-(void) someMethod
{
    [self instanceMethod];
}

Но, class methods должен быть вызван для самого класса:

[MyClass classMethod];

Или:

MyClass* myClass = [[MyClass alloc] init];
[myClass class] classMethod];

Это не сработает:

// Error
[myClass classMethod];
// Error
[self classMethod];
1 голос
/ 12 июня 2016

Примечание: Это только в формате псевдокода

Метод класса

Почти все, что нужно сделать, это время компиляции . Он не нуждается ни в каком пользовательском вводе, ни его вычисление основано на экземпляре. Все в нем основано на классе / чертеже, который уникален, т. Е. У вас нет нескольких чертежей для одного класса. У вас могут быть разные вариации во время компиляции? Нет, поэтому класс является уникальным, и поэтому независимо от того, сколько раз вы вызываете метод класса, указатель на него будет одинаковым.

PlanetOfLiving: return @"Earth" // No matter how many times you run this method...nothing changes.

Метод экземпляра

Напротив, метод экземпляра происходит во время выполнения, так как только тогда вы создали экземпляр чего-то, что может варьироваться при каждом создании.

initWithName: @"John" lastName: @"Doe"Age:12 @"cool"
initWithName: @"Donald" lastName: @"Drumpf"Age:5 attitude:@"He started"
initWithName: @"President" lastName: @"Obama"Age:54 attitude: @"Awesome"
//As you can see the value can change for each instance.

Если вы используете другие языки, статические методы такие же, как методы класса.
Если вы пришли из Swift, методы типа такие же, как методы класса.

1 голос
/ 17 марта 2011

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

1 голос
/ 18 января 2012

Также помните, что та же идея относится и к переменным. Вы встретите такие термины, как static, member, instance, class и т. Д., Когда говорите о переменных так же, как и для методов / функций.

Кажется, что общий термин в сообществе Obj-C - это ivar, например, переменная экземпляра, но я пока не парень из Obj-C.

1 голос
/ 25 февраля 2013

Обновление вышеупомянутых ответов, я согласен, методы экземпляра используют экземпляр класса, тогда как метод класса может использоваться только с именем класса.

Больше нет никакой разницы между методом экземпляра и методом класса после того, как в Objective-C появился автоматический подсчет ссылок.

Например, [NS StringWithformat:..] метод класса и [[NSString alloc] initwihtformat:..] метод экземпляра, оба одинаковые после ARC

0 голосов
/ 08 февраля 2017

Добавление к ответам выше

Метод класса будет работать с классом, мы будем использовать его для общего назначения, например, + stringWithFormat, размер класса и, что наиболее важно, для init и т. Д.

NSString *str = [NSString stringWithFormat:@"%.02f%%",someFloat]; 

Метод экземпляра будет работать с экземпляром класса, а не с классом, как у нас есть два человека, и мы хотим узнать баланс каждого в отдельности, здесь нам нужно использовать метод экземпляра. Потому что это не вернет общий ответ. например как определить количество NSSArray и т. д.

[johnson getAccountBalance];
[ankit getAccountBalance];
...