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


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

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

18 428

18 ответов:

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

@interface MyClass : NSObject

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

@end

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

[MyClass aClassMethod];

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

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

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

enter image description here

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

enter image description here

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

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

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

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

главная.м:

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

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

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

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

В 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, однако на разных языках методы класса могут называться статическими методами.

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

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

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

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

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

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

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

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

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

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

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

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

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

[CCar registerCar:self]

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

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

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

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

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

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

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

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. Методы экземпляра работают с конкретными экземплярами классов. Методы экземпляра не объявляются как статические.

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

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


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


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


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


вызов


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

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


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

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

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

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

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

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

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

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

метод класса

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

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 и т. д.

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

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

[johnson getAccountBalance];

[ankit getAccountBalance];