В чем разница между методами class и instance?

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

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

18 ответов


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

@interface MyClass : NSObject

+ (void)aClassMethod;
- (void)anInstanceMethod;

@end

их можно было бы использовать так:

[MyClass aClassMethod];

MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];

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


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

enter image description here

A класс как план дома: у вас есть только один план, и (обычно) вы не можете сделать так много с одним планом.

enter image description here

An экземпляр (или объект) является фактическим дома что вы строите на основе плана: вы можете построить много домов из того же плана. Затем вы можете покрасить стены в разные цвета в каждом из домов, так же как вы можете самостоятельно изменять свойства каждого экземпляра класса, не влияя на другие экземпляры.


как и в других ответах, методы экземпляра работают с объектом и имеют доступ к его переменным экземпляра, в то время как метод класса работает с классом в целом и не имеет доступа к переменным конкретного экземпляра (если вы не передаете экземпляр в качестве параметра).

хорошим примером метода класса является метод counter-type, который возвращает общее количество экземпляров класса. Методы класса начинаются с +, в то время как экземпляры начинаются с -. Например:

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.м:

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];

не инстанцировать класс!

вы также можете использовать класс функции, возвращающие объекты autoreleased, как

+ (NSArray *)arrayWithObject:(id)object

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

Я надеюсь, теперь вы понимаете, когда и/или почему вы должны использовать методы класса!!


метод экземпляра применяется к экземпляру класса (т. е. объекту), тогда как метод класса применяется к самому классу.

В C# метод класса объявлен статическим. Методы и свойства, не отмеченные статическими, являются методами экземпляра.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}

Я думаю, что лучший способ понять это-посмотреть alloc и init. Именно это объяснение позволило мне понять различия.

Метод Класса

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

Метод

метод экземпляра используется для изменения конкретного экземпляра класса, уникального для этого экземпляра, а не для класса в целом. (обозначается - перед объявлением метода), является методом экземпляра, потому что вы обычно изменяете свойства этого класса после его создания с помощью alloc.

пример

NSString *myString = [NSString alloc];

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

[myString initWithFormat:@"Hope this answer helps someone"];

вы изменяете экземпляр NSString под названием myString установив некоторые свойства в этом экземпляре. Обратите внимание, что получатель сообщения является экземпляром (объектом класса NSString).


ответ на ваш вопрос не относится к objective-c, однако на разных языках методы класса могут называться статическими методами.

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

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

  • работать с переменными класса (они не могут получить доступ к переменным экземпляра)
  • не требуется экземпляр объекта для применения
  • иногда может быть запах кода (некоторые люди, которые являются новыми для Использование ООП в качестве костыля для структурированного программирования в среде ОО)

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

  • работы на экземпляры переменных класса
  • должна иметь объект instanciated работы на

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

например, [NSString stringWithFormat:@"SomeParameter"]; возвращает NSString экземпляр с переданным ему параметром. Следовательно, поскольку это метод класса, который возвращает объект своего типа, он также называется методом удобства.


так если я правильно понимаю.

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

A instance метод как раз наоборот. Вы не можете вызвать его, если не Выделите экземпляр этого класса. Его как обычный класс, который имеет конструктор и деструктор (которая очищает всю выделенную память).

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


методы экземпляров работают с экземплярами классов (т. е. "объекты"). Методы класса связаны с классами (в большинстве языков используется ключевое слово static для этих ребят).


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

[CCar registerCar:self]

таким образом, класс CCar может составить список каждого экземпляра CCar. Допустим, пользователь заканчивает уровень и хочет удалить все автомобили... вы можете либо: 1 - составить список всех Ссагбыл вы создали вручную, и делать whicheverCar.remove(); или 2 - Добавить метод removeAllCars в Ссагбыл, который будет делать это за вас, когда вы называете [Ссагбыл removeAllCars]. Т. е. allCars[n].remove();

или, например, вы позволяете пользователю указать размер шрифта по умолчанию для всего приложения, которое загружается и сохраняется при запуске. Без метода class вам, возможно, придется сделать что-то вроде

fontSize = thisMenu.getParent().fontHandler.getDefaultFontSize();

С помощью метода класса вы можете уйти с [FontHandler getDefaultFontSize].

Что касается вашей функции removeVowels, вы обнаружите, что такие языки, как C#, на самом деле имеют оба с определенными методами, такими как toLower или toUpper.

например myString.removeVowels() и String.removeVowels(myString) (в ObjC это будет [String removeVowels:myString]).

в этом случае экземпляр, вероятно, вызывает метод class, поэтому оба доступны. т. е.

public function toLower():String{
  return String.toLower();
}

public static function toLower( String inString):String{
 //do stuff to string..
 return newString;
}

по сути, myString.toLower() звонки [String toLower:ownValue]

нет окончательного ответа, но если вы хотите, чтобы метод класса улучшил ваш код, дайте ему шанс и имейте в виду, что метод класса позволит вам использовать только другой класс методы / переменные.


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

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

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

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


в 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];

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


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


МЕТОДЫ ЭКЗЕМПЛЯРА


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


INVOKE


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

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


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


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


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

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


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

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

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

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

метод класса

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

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, методы типа такие же, как методы класса.


добавление к вышеуказанным ответам

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

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

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

[johnson getAccountBalance];

[ankit getAccountBalance];