Jaka jest różnica między metodami klasy I instancji?

Jaka jest różnica między metodą klasy A metodą instancji?

Czy metody instancji są accessorami (geterami i seterami), podczas gdy metody klas są praktycznie wszystkim innym?

Author: Josh Caswell, 2009-06-28

18 answers

Jak większość innych odpowiedzi powiedziała, metody instancyjne używają instancji klasy, podczas gdy metody klasowe mogą być używane tylko z nazwą klasy. W Objective-C są zdefiniowane następująco:

@interface MyClass : NSObject

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

@end

Mogą być wtedy używane w następujący sposób:

[MyClass aClassMethod];

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

Niektóre rzeczywiste przykłady metod klas są wygodnymi metodami na wielu podstawowych klasach, takich jak NSString ' S +stringWithFormat: lub NSArray'S +arrayWithArray:. Metoda instancji to metoda NSArray 'S -count.

 652
Author: Cory Kilger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-26 17:11:55

Wszystkie szczegóły techniczne zostały ładnie omówione w pozostałych odpowiedziach. Po prostu chcę podzielić się prostą analogią, która moim zdaniem ładnie ilustruje różnicę między klasą A instancją:

Tutaj wpisz opis obrazka

A klasa jest jak schemat domu: masz tylko jeden schemat i (zazwyczaj) nie możesz zrobić zbyt wiele z samym schematem.

Tutaj wpisz opis obrazka

Instancja (lub obiekt ) jest Rzeczywistym domem , który buduj na podstawie planu: możesz zbudować wiele domów z tego samego planu. Możesz następnie pomalować ściany na inny kolor w każdym z domów, tak jak możesz niezależnie zmieniać właściwości każdej instancji klasy bez wpływu na inne instancje.

 185
Author: Johannes Fahrenkrug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-13 15:57:07

Podobnie jak w innych odpowiedziach, metody instancji działają na obiekcie i mają dostęp do zmiennych instancji, podczas gdy metoda klasy działa na klasie jako całości i nie ma dostępu do zmiennych danej instancji (chyba że podasz instancję jako parametr).

Dobrym przykładem metody klasowej jest metoda typu counter, która zwraca całkowitą liczbę instancji klasy. Metody klasowe zaczynają się od +, podczas gdy instancje zaczynają się od -. Na przykład:

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

Wyjście: Wiek: 0 Liczba osób: 2

Innym przykładem jest, jeśli masz metodę, którą chcesz, aby użytkownik mógł wywołać, czasami dobrze jest zrobić z niej metodę klasową. Na przykład, jeśli masz klasę o nazwie MathFunctions, możesz to zrobić:

+ (int)square:(int)num{ 
      return num * num;
}

Więc wtedy użytkownik zadzwoni:

[MathFunctions square:34];

bez konieczności tworzenia instancji klasy!

Możesz również użyć funkcji klasy do zwracania autoalarmów obiekty, takie jak NSArray ' s

+ (NSArray *)arrayWithObject:(id)object

To pobiera obiekt, umieszcza go w tablicy i zwraca autoreleased wersję tablicy, która nie musi być zarządzana pamięcią, świetnie nadaje się do tablic temperoralnych i innych.

Mam nadzieję, że teraz rozumiesz, kiedy i / lub dlaczego powinieneś używać metod klasowych!!

 102
Author: micmoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-04 13:38:31

Metoda instancji ma zastosowanie do instancji klasy (tj. obiektu), podczas gdy metoda klasy ma zastosowanie do samej klasy.

W C# metoda klasy jest oznaczana jako statyczna. Metody i właściwości nie oznaczone static są metodami instancyjnymi.

class Foo {
  public static void ClassMethod() { ... }
  public void InstanceMethod() { ... }
}
 35
Author: Robert Horvick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 20:51:05

Myślę, że najlepszym sposobem, aby to zrozumieć, jest spojrzenie na alloc i init. To właśnie to Wyjaśnienie pozwoliło mi zrozumieć różnice.

Metoda Klasy

Metoda klasy jest stosowana do klasy jako całości. Jeśli zaznaczysz metodę alloc, będzie to metoda klasy oznaczona przez + przed deklaracją metody. Jest to metoda klasy, ponieważ jest stosowana do klasy, aby utworzyć konkretną instancję tej klasy.

Instancja Metoda

Używasz metody instancji, aby zmodyfikować konkretną instancję klasy, która jest unikalna dla tej instancji, a nie dla całej klasy. init na przykład (oznaczona - przed deklaracją metody), jest metodą instancji, ponieważ zwykle modyfikujesz właściwości tej klasy po jej utworzeniu za pomocą alloc.

Przykład

NSString *myString = [NSString alloc];

Wywołujesz metodę klasy alloc w celu wygenerowania instancji o tej klasy. Zauważ, że odbiorcą wiadomości jest klasa.

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

Modyfikujesz instancję NSString o nazwie myString, ustawiając pewne właściwości tej instancji. Zwróć uwagę, że odbiorcą wiadomości jest instancja (obiekt klasy NSString).

 16
Author: Adam Waite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-24 14:23:25

Odpowiedź na twoje pytanie nie jest specyficzna dla objective-c, jednak w różnych językach metody klasowe mogą być nazywane metodami statycznymi.

Różnica między metodami klasy A metodami instancji wynosi

Metody klas

  • operować na zmiennych klasy (nie mogą uzyskać dostępu do zmiennych instancji)
  • do not require a object to be instantiated to be applied
  • czasami może być zapach kodu (niektórzy ludzie, którzy są nowi w OOP używać jako kulę do zrobienia strukturyzowane Programowanie w środowisku OO)

Instance methods

  • operuj na zmiennych instancji i zmiennych klasy
  • musi mieć instancjowany obiekt do działania
 15
Author: hhafez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 10:42:15

Metody klasy są zwykle używane do tworzenia instancji tej klasy

Na przykład, [NSString stringWithFormat:@"SomeParameter"]; zwraca instancję NSString z parametrem, który jest do niej wysyłany. Stąd, ponieważ jest to metoda klasy, która zwraca obiekt swojego typu, nazywana jest również metodą wygodną.

 6
Author: iosrookie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-20 00:07:24

Więc jeśli dobrze to Rozumiem.

Metoda class nie wymaga przydzielania instancji tego obiektu do użycia / przetworzenia. Metoda class jest samodzielna i może działać bez zależności od stanu dowolnego obiektu tej klasy. Oczekuje się, że metoda class przydzieli pamięć dla całej swojej własnej pracy i zmniejszy alokację, gdy zostanie wykonana, ponieważ żadna instancja tej klasy nie będzie w stanie zwolnić żadnej pamięci przydzielonej w poprzednich wywołaniach do metody klasy.

A instance metoda jest tylko przeciwnie. Nie można go wywołać, chyba że przydzielisz instancję tej klasy. Jest jak normalna klasa, która ma konstruktor i może mieć Destruktor (który czyści całą przydzieloną pamięć).

Z dużym prawdopodobieństwem (chyba że piszesz bibliotekę wielokrotnego użytku, nie powinieneś potrzebować zmiennej class.

 6
Author: Siddharth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 01:35:59

Instancje metody operują na instancjach klas (tj. "obiektach"). Metody klas są powiązane z klasami (większość języków używa dla nich słowa kluczowego static).

 4
Author: eduffy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-27 20:51:52

Weźmy na przykład grę, w której powstaje wiele samochodów.. każdy należy do klasy CCar. Kiedy samochód jest instancjowany, wykonuje połączenie do

[CCar registerCar:self]

Klasa CCar może więc utworzyć listę wszystkich instancji CCar. Załóżmy, że użytkownik kończy poziom i chce usunąć wszystkie samochody... możesz albo: 1-Przejrzyj listę wszystkich CCar utworzonych ręcznie i wykonaj whicheverCar.remove(); lub 2-Dodaj metodę removeAllCars do CCar, która zrobi to za ciebie, gdy wywołasz [CCar removeAllCars]. Tj. allCars[n].remove();

Lub na przykład pozwalasz użytkownikowi określić domyślny rozmiar czcionki dla całej aplikacji, która jest ładowana i zapisywana podczas uruchamiania. Bez metody class, być może będziesz musiał zrobić coś takiego jak

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

Z metodą klasową, można ujść na sucho [FontHandler getDefaultFontSize].

Jeśli chodzi o funkcję removeVowels, przekonasz się, że języki takie jak C# mają obie z pewnymi metodami, takimi jak toLower lub toUpper.

Np. myString.removeVowels() i String.removeVowels(myString) (W ObjC, który byłby [String removeVowels:myString]).

W tym przypadku instancja prawdopodobnie wywoła metodę class, więc obie są dostępne. tj.

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]

Nie ma ostatecznej odpowiedzi, ale jeśli czujesz, że wpychanie metody klasowej poprawiłoby Twój kod, daj jej szansę i pamiętaj, że metoda klasowa pozwoli Ci używać tylko innych metod/zmiennych klasowych.

 3
Author: sicklebrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 10:17:35

Metody klas

Są metodami deklarowanymi jako statyczne. Metodę można wywołać bez tworzenia instancji klasy. Metody klas mogą działać tylko na członkach klasy, a nie na członach instancji, ponieważ metody klas nie są świadome członków instancji. Metody instancji klasy również nie mogą być wywoływane z wewnątrz metody klasy, chyba że są wywoływane na instancji tej klasy.

Instance methods

Z drugiej strony wymagają instancja klasy, która istnieje, zanim będzie mogła zostać wywołana, więc instancja klasy musi zostać utworzona za pomocą nowego słowa kluczowego. Metody instancji działają na konkretnych instancjach klas. Metody instancji nie są deklarowane jako statyczne.

 3
Author: iCrazyDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-07 09:34:24

W Objective-C wszystkie metody rozpoczynają się znakiem " - "lub"+". Przykład:

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

+ (void) classMethod;
@end

Znaki "+" i "-" określają, czy metoda jest odpowiednio class method czy instance method.

Różnica byłaby jasna, gdybyśmy nazywali te metody. Tutaj metody są zadeklarowane w MyClass.

instance method wymagaj instancji klasy:

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

Wewnątrz MyClass Inne metody mogą wywoływać instancje metod MyClass używając self:

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

Ale class methods musi być wywołane na samej klasie:

[MyClass classMethod];

Lub:

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

To nie zadziała:

// Error
[myClass classMethod];
// Error
[self classMethod];
 3
Author: Tulon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 09:51:06

METODY KLAS


Metoda klasy zazwyczaj tworzy nową instancję klasy lub pobiera pewne globalne właściwości klasy. Metody klas nie działają na instancji ani nie mają dostępu do zmiennej instancji.


INSTANCE METHODS


Metoda instancji działa na konkretnej instancji klasy. Na przykład zaimplementowana metoda accessors to wszystkie metody instancji. Używasz ich do ustawiania lub pobierania zmiennych instancji konkretny obiekt.


INVOKE


Aby wywołać metodę instancji, wysyłasz wiadomość do instancji klasy.

Aby wywołać metodę klasy, wysyłasz wiadomość bezpośrednio do klasy.


Źródło: iOS-Objective - C-metody klasowe i Instancyjne

 3
Author: Nam N. HUYNH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-23 18:10:29

Metody klasy nie mogą zmieniać ani znać wartości zmiennej instancji. To powinny być kryteria pozwalające stwierdzić, czy metoda instancji może być metodą klasową.

 1
Author: Deepee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-17 15:55:10

Pamiętaj również, że ta sama idea dotyczy zmiennych. Można natknąć się na terminy takie jak static, member, instance, class i tak dalej, gdy mówimy o zmiennych takich samych jak w przypadku metod / funkcji.

Wydaje się, że powszechnym określeniem we Wspólnocie Obj-C jest np. zmienna ivar, ale nie jestem jeszcze facetem Obj-C.

 1
Author: Half_Duplex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-18 14:12:38

Aktualizacja do powyższych odpowiedzi, zgadzam się, że metody instancji używają instancji klasy, podczas gdy metody klasy mogą być używane tylko z nazwą klasy.

Nie ma już żadnej różnicy między metodą instancji a metodą klasy po tym, jak w Objective-C pojawiło się automatyczne zliczanie referencji.

Na przykład[NS StringWithformat:..] metoda klasy & [[NSString alloc] initwihtformat:..] Metoda instancji, obie są takie same po łuku

 1
Author: user1292809,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 07:02:11

Uwaga: jest to tylko w formacie pseudo kodu

Metoda Klasy

Prawie wszystko, co musi zrobić, to podczas kompilacji. Nie wymaga żadnych danych wejściowych użytkownika, ani obliczenia nie są oparte na instancji. Wszystko w nim opiera się na klasie/blueprint-który jest unikalny, tzn. nie masz wielu schematów dla jednej klasy. Czy można mieć różne odmiany w czasie kompilacji? Nie, dlatego klasa jest wyjątkowa i tak bez względu na to, ile razy wywołujesz metodę klasy wskaźnik wskazujący na nią będzie taki sam.

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

Metoda Instancji

Przeciwnie, metoda instancji dzieje się podczas runtime, ponieważ to tylko wtedy utworzyłeś instancję czegoś, co może się różnić w zależności od każdej instancji.

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.

Jeśli pochodzisz z innych języków statyczne metody są takie same jak metody klasowe.
Jeśli pochodzisz z Swift, metody typu są takie same jak metody klasowe.

 1
Author: Honey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-15 00:03:40

Dodawanie do powyższych odpowiedzi

Metoda Class będzie działać na klasie, użyjemy jej do ogólnego przeznaczenia, gdzie jak + stringWithFormat, wielkość klasy i co najważniejsze dla init itp

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

Metoda Instancyjna będzie działać na instancji klasy, a nie na klasie, jak mamy dwie osoby i chcemy poznać równowagę każdej z nich osobno tutaj musimy użyć metody instancyjnej. Ponieważ nie zwróci ogólnej odpowiedzi. np. jak określić liczbę NSSArray itp.

[johnson getAccountBalance];

[ankit getAccountBalance];

 0
Author: Ankit garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 11:38:20