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

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

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

Ответ 1

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

@interface MyClass : NSObject

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

@end

Затем они могут быть использованы следующим образом:

[MyClass aClassMethod];

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

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

Ответ 2

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

enter image description here

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

enter image description here

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

Ответ 3

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

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

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

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

без необходимости создавать экземпляр класса!

Вы также можете использовать функции класса для возврата объектов с автореализацией, таких как NSArray

+ (NSArray *)arrayWithObject:(id)object

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

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

Ответ 4

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

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

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

Ответ 5

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

Метод класса

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

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

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

Пример

NSString *myString = [NSString alloc];

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

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

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

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

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

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

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

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

Ответ 12

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

Ответ 13

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


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


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


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


ВЫЗОВ


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

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


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

Ответ 14

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

Ответ 15

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

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

Ответ 16

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

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

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

Ответ 17

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

Метод класса

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

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

Ответ 18

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

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

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

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

[johnson getAccountBalance];

[ankit getAccountBalance];