Вопрос по objective-c, oop – В чем разница между методами класса и экземпляра?

435

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

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

Ваш Ответ

18   ответов
35

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

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

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
Никто не пострадал. Первая часть вашего ответа верна в качестве общего принципа ООП и определенно относится к Objective-C. Вы можете добавить & quot; target-c & quot; в свой список тегов, которые следует игнорировать, если вы не хотите видеть такие вопросы, хотя любое участие, безусловно, приветствуется. :-)
Извините, я только что заметил, что это был вопрос Obj-C. Надеюсь, мой ответ по-прежнему применим, но, пожалуйста, проголосуйте против или проголосуйте за удаление.
3

CLASS METHODS


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


INSTANCE METHODS


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


INVOKE


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

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


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

Привет Huynh, пожалуйста, посмотритеhere
6

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

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

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

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

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

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

Class Method

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

Instance Method

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

Example

NSString *myString = [NSString alloc];

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

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

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

Что вы подразумеваете под проверкой «alloc»? метод? Можете ли вы указать мне конкретное место в документации? (изменить) - & gt; ааа, неважно, да, в документах NSObject сказано, что в разделе "Задачи" -developer.apple.com/library/ios/documentation/cocoa/reference/…
Вам действительно не нужно понимать, что он делает, чтобы понять это, просто то, что он применяется к классу. Проще говоря:alloc выделяет достаточно памяти для объекта,init изменит то, что в этих адресах памяти, чтобы определить состояние объекта. Мы не можем изменить объект, если нет места для его изменения, поэтому мы используемalloc на классе, который решит дать нам это пространство.
0

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

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

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

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

[johnson getAccountBalance];
[ankit getAccountBalance];
1

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

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

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

1

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

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

189

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

enter image description here

class это какblueprint дома: у вас есть только один проект, и (обычно) вы не можете сделать это с помощью одного проекта.

enter image description here

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

Такое отличное объяснение :)
@JohannesFahrenkrug Хорошо объяснил концепцию класса и объекта здесь. Не фактический вопрос дляdifference between class method and an instance method ;
Прекрасное объяснение класса против экземпляра класса. Классы являются странным понятием для новичков, и это объясняет это самым фундаментальным образом.
@JohannesFahrenkrug действительно хорошее объяснение, которое заставило меня задуматься о том, как использовать оба варианта и когда использовать оба
Хорошая аналогия. Пожалуйста, кто-нибудь даст этому парню годовой запас пиццы.
15

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

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

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

  • Operate on Class variables (they can not access instance variables)
  • Do not require an object to be instantiated to be applied
  • Sometimes can be a code smell (some people who are new to OOP use as a crutch to do Structured Programming in an OO enviroment)

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

  • Operate on instances variables and class variables
  • Must have an instanciated object to operate on
Методы экземпляра могут работать с переменными класса?
3

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

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

3

В Objective-C все методы начинаются с символа & quot; - & quot; или & quot; + & quot; персонаж. Пример:

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

+ (void) classMethod;
@end

& Quot; + & quot; и & quot; - & quot; символы указывают, является ли метод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

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

-1 от меня, потому что вы можете передать экземпляр методу класса, и он сможет изменить и узнать его переменные & apos; ценности.
3

class methods

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

Instance methods

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

Он также может быть создан с помощью «alloc» ключевое слово не только "новый". Кроме того, Objective-C не требует существования экземпляра для вызова метода экземпляра, вы можете отправлять сообщения с нулевым указателем.
102

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

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

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

without ever having to instantiate the class!

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

+ (NSArray *)arrayWithObject:(id)object

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

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

@selytch & quot; age & quot; должно быть определено как свойство, чтобы использовать синтез.
Простите за путаницу с новичком, но зачем вам нужна переменная экземпляра & quot; age & quot; и метод экземпляра "возраст"? Не будет получателя и установщика для переменной экземпляра "возраст" быть создан с @synthetize?
micmoo, могу ли я предложить вам поставить "static int numberOfPeople = 0;" в коде отформатированный текст? Я был в замешательстве, пока не заметил это над примером кода. Кроме этого, очень краткий ответ.
1

Note: Это только в формате псевдокода

Class method

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

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

Instance Method

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

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

659

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

@interface MyClass : NSObject

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

@end

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

[MyClass aClassMethod];

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

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

& quot; тогда как метод класса может использоваться только с именем класса. & quot; или объект класса
Статические методы @BrianPan и методы классов не совпадают. Они похожи, но причина, по которой они называются по-разному, заключается в том, что они работают по-разному. Например, статические методы не могут быть переопределены.
Хороший ответ. Также стоит отметить, что вы увидите конкретную сокращенную запись для описания методов. Например, + [NSString stringWithFormat:] является методом класса + stringWithFormat: on NSString; - [NSArray objectAtIndex:] является методом экземпляра. Методы с несколькими частями селектора пишутся как - [NSMutableDictionary setObject: forKey:] и т. Д. Вы часто будете видеть это обозначение в ответах Какао, документации и в Xcode.
Извините за волнение ... но я только что узнал разницу и ее потенциал. методы класса рок и так же классы синглтон! Уффф, я влюбился! & Lt; 3
Я бы добавил, что метод класса называется «статическим» метод на многих других языках. И чтобы ответить на первоначальный вопрос, методы доступа являются методами экземпляра, потому что они устанавливают и получают состояние конкретного экземпляра. В приведенном выше примере NSArray count возвращает количество объектов в конкретном экземпляре.
6

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

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

4

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

Похожие вопросы