Jaka jest różnica między metodą klasy a metodą instancji?
Czy metody instancji są akcesorami (modułami pobierającymi i ustawiającymi), podczas gdy metody klasowe to właściwie wszystko inne?
Jaka jest różnica między metodą klasy a metodą instancji?
Czy metody instancji są akcesorami (modułami pobierającymi i ustawiającymi), podczas gdy metody klasowe to właściwie wszystko inne?
Podobnie jak większość innych odpowiedzi, metody instancji wykorzystują instancję klasy, podczas gdy metoda klasy może być używana tylko z nazwą klasy. W Celu C są one zdefiniowane w następujący sposób:
@interface MyClass : NSObject
+ (void)aClassMethod;
- (void)anInstanceMethod;
@end
Można je następnie wykorzystać w następujący sposób:
[MyClass aClassMethod];
MyClass *object = [[MyClass alloc] init];
[object anInstanceMethod];
Niektóre przykłady świata rzeczywistego z metod klasy są metody wygoda na wiele klas, takich jak Foundation NSString
„s +stringWithFormat:
lub NSArray
” s +arrayWithArray:
. Metoda przykład byłoby NSArray
„S -count
metodą.
Wszystkie szczegóły techniczne zostały ładnie ujęte w innych odpowiedziach. Chcę tylko podzielić się prostą analogią, która moim zdaniem dobrze ilustruje różnicę między klasą a instancją:
Klasa jest jak plan domu: Masz tylko jeden plan i (zazwyczaj) nie można zrobić, że wiele z samym planem.
Przykład (lub obiekt ) jest rzeczywistą dom , który budować w oparciu o plan: Można budować wiele domów z tego samego planu. Następnie możesz pomalować ściany innym kolorem w każdym domu, tak jak możesz niezależnie zmieniać właściwości każdej instancji klasy bez wpływu na inne instancje.
źródło
difference between class method and an instance method
;Podobnie jak inne odpowiedzi, 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 konkretnej instancji (chyba że instancja zostanie przekazana jako parametr).
Dobrym przykładem metody klasowej jest metoda typu przeciwnego, która zwraca całkowitą liczbę instancji klasy. Metody klas zaczynają się od a
+
, podczas gdy metody instancji zaczynają się od-
. Na przykład:main.m:
Wyjście: Wiek: 0 Liczba osób: 2
Innym przykładem jest metoda, którą użytkownik może wywoływać, czasem dobrze jest uczynić ją metodą klasową. Na przykład, jeśli masz klasę o nazwie MathFunctions, możesz to zrobić:
Zatem użytkownik zadzwoni:
bez konieczności tworzenia klasy!
Możesz także użyć funkcji klasy do zwracania automatycznie wydanych obiektów, takich jak NSArray
To pobiera obiekt, umieszcza go w tablicy i zwraca automatycznie wydaną wersję tablicy, która nie musi być zarządzana pamięcią, co jest idealne dla tablic temperamentalnych i nie tylko.
Mam nadzieję, że teraz rozumiesz, kiedy i / lub dlaczego powinieneś używać metod klasowych !!
źródło
Metoda instancji ma zastosowanie do instancji klasy (tj. Obiektu), podczas gdy metoda klasy ma zastosowanie do samej klasy.
W języku C # metoda klasy jest oznaczona statycznie. Metody i właściwości nieoznaczone statycznie są metodami instancji.
źródło
Odpowiedź na twoje pytanie nie jest specyficzna dla celu-c, jednak w różnych językach metody klasowe można nazwać metodami statycznymi.
Różnice między metodami klasowymi a metodami instancji są następujące
Metody klasowe
Metody instancji
źródło
Myślę, że najlepszym sposobem na zrozumienie tego jest spojrzenie na
alloc
iinit
. To wyjaśnienie pozwoliło mi zrozumieć różnice.Metoda klasowa
Metoda klasy jest stosowana do całej klasy. Jeśli
alloc
zaznaczysz metodę, jest to metoda klasy oznaczona przez+
przed deklaracją metody. Jest to metoda klasowa, ponieważ jest stosowana do klasy w celu utworzenia określonego wystąpienia tej klasy.Metoda wystąpienia
Metoda instancji służy do modyfikowania określonej instancji klasy, która jest unikalna dla tej instancji, a nie dla klasy jako całości.
init
na przykład (oznaczony-
przed deklaracją metody), jest metodą instancji, ponieważ zwykle modyfikuje się właściwości tej klasy po jej utworzeniualloc
.Przykład
Wywołujesz metodę klasy
alloc
, aby wygenerować instancję tej klasy. Zauważ, że odbiorcą wiadomości jest klasa.Zmieniasz instancję
NSString
wywoływanejmyString
przez ustawienie niektórych właściwości dla tej instancji. Zwróć uwagę, w jaki sposób odbiorca wiadomości jest instancją (obiektem klasyNSString
).źródło
alloc
przydziela wystarczającą ilość pamięci dla obiektu,init
zmodyfikuje zawartość tych adresów pamięci, aby zdefiniować stan obiektu. Nie możemy modyfikować obiektu, chyba że będzie w nim miejsce do modyfikacji, więc korzystamyalloc
z klasy, która zdecyduje się dać nam tę przestrzeń.Metody klasy są zwykle używane do tworzenia instancji tej klasy
Na przykład
[NSString stringWithFormat:@"SomeParameter"];
zwracaNSString
instancję z parametrem, który jest do niej wysyłany. Dlatego, ponieważ jest to metoda klasy, która zwraca obiekt tego typu, jest również nazywana metodą wygody.źródło
Więc jeśli dobrze to rozumiem.
class
Metoda nie musisz przeznaczyć instancji tego obiektu do użytkowania / przetworzyć.class
Metoda jest autonomiczny i może pracować bez uzależnienia od stanu dowolnego obiektu tej klasy.class
Oczekuje się metoda przydzielić pamięci dla całej swojej pracy i zwalnianie kiedy zrobić, ponieważ nie instancja tej klasy będą mogły uwolnić żadnej pamięci przydzielonej w poprzednich wywołań metody klasy.instance
Metoda jest dokładnie odwrotnie. Nie możesz do niego zadzwonić, dopóki nie przydzielisz instancji tej klasy. To jest jak normalna klasa, która ma konstruktor i może mieć destruktor (który czyści całą przydzieloną pamięć).Najprawdopodobniej (chyba że piszesz bibliotekę wielokrotnego użytku, nie potrzebujesz
class
zmiennej).źródło
Metody instancji działają na instancjach klas (tj. „Obiektach”). Metody klasowe są powiązane z klasami (większość języków używa tych słów kluczowych
static
).źródło
Weźmy na przykład grę, w której odradza się wiele samochodów. Każdy z nich należy do klasy CCar. Po utworzeniu instancji samochodu następuje połączenie z
Tak więc klasa CCar może tworzyć listę wszystkich instancji CCar. Powiedzmy, że użytkownik kończy poziom i chce usunąć wszystkie samochody ... możesz: 1 - Przejrzeć listę każdego CCar utworzonego ręcznie i zrobić
whicheverCar.remove();
lub 2 - Dodać metodę removeAllCars do CCar, która to zrobi dla ciebie, gdy zadzwonisz [CCar removeAllCars]. To znaczyallCars[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 klasy może być konieczne wykonanie czegoś takiego
Dzięki metodzie klasy możesz uciec
[FontHandler getDefaultFontSize]
.Jeśli chodzi o funkcję removeVowels, przekonasz się, że języki takie jak C # faktycznie mają obie z pewnymi metodami, takimi jak toLower lub toUpper.
np.
myString.removeVowels()
iString.removeVowels(myString)
(w ObjC byłoby[String removeVowels:myString]
).W takim przypadku instancja prawdopodobnie wywołuje metodę klasy, więc obie są dostępne. to znaczy
w zasadzie
myString.toLower()
połączenia[String toLower:ownValue]
Nie ma ostatecznej odpowiedzi, ale jeśli masz ochotę wepchnąć metodę klasową, poprawiłbyś swój kod, wypróbuj go i pamiętaj, że metoda klasowa pozwoli ci tylko na użycie innych metod / zmiennych klasowych.
źródło
metody klasowe
są metodami zadeklarowanymi jako statyczne. Metodę można wywołać bez tworzenia instancji klasy. Metody klasy mogą działać tylko na elementach klasy, a nie na elementach instancji, ponieważ metody klasy nie są świadome elementów instancji. Metod instancji klasy nie można również wywoływać z metody klasy, chyba że są one wywoływane w instancji tej klasy.
Metody instancji
z drugiej strony wymaga wystąpienia instancji klasy, zanim będzie można ją wywołać, dlatego należy utworzyć instancję klasy przy użyciu nowego słowa kluczowego. Metody instancji działają na określonych instancjach klas. Metody instancji nie są deklarowane jako statyczne.
źródło
W Objective-C wszystkie metody zaczynają się od znaku „-” lub „+”. Przykład:
Znak „+” i „-” znaków określić, czy dana metoda jest
class method
alboinstance method
odpowiednio.Różnica byłaby wyraźna, gdybyśmy wywołali te metody. Tutaj metody są zadeklarowane w
MyClass
.instance method
wymagają wystąpienia klasy:Wewnątrz
MyClass
inne metody mogą wywoływać metody instancjiMyClass
przy użyciuself
:Ale
class methods
należy wywołać samą klasę:Lub:
To nie zadziała:
źródło
METODY KLASOWE
Metoda klasy zazwyczaj tworzy nową instancję klasy lub pobiera niektóre globalne właściwości klasy. Metody klasy nie działają na instancji ani nie mają dostępu do zmiennej instancji.
METODY INSTANCJI
Metoda instancji działa na konkretnej instancji klasy. Na przykład zaimplementowana metoda akcesorów to wszystkie metody instancji. Używasz ich do ustawiania lub pobierania zmiennych instancji określonego obiektu.
ODWOŁAĆ SIĘ
Aby wywołać metodę instancji, wysyłasz wiadomość do instancji klasy.
Aby wywołać metodę klasy, wyślij wiadomość bezpośrednio do klasy.
Źródło: IOS - Objective-C - Metody klasowe i metody instancji
źródło
Metody klasy nie mogą zmieniać ani znać wartości żadnej zmiennej instancji. To powinny być kryteria pozwalające stwierdzić, czy metoda instancji może być metodą klasy.
źródło
Pamiętaj również, że ten sam pomysł dotyczy zmiennych. Podczas mówienia o zmiennych takich samych, jak w przypadku metod / funkcji, można spotkać terminy takie jak static, member, instance, class i tak dalej.
Wydaje się, że powszechnym terminem w społeczności Obj-C jest na przykład zmienna ivar, ale jeszcze nie jestem facetem Obj-C.
źródło
Aktualizacja powyższych odpowiedzi. Zgadzam się, że metody instancji używają instancji klasy, podczas gdy metody klasy można używać tylko z nazwą klasy.
Nie ma już żadnej różnicy między metodą instancji i metodą klasy po automatycznym zliczaniu referencji w Objective-C.
Na przykład
[NS StringWithformat:..]
metoda klasy i[[NSString alloc] initwihtformat:..]
metoda instancji oba są takie same po ARCźródło
Uwaga: Jest to tylko w formacie pseudokodu
Metoda klasowa
Prawie wszystko, co musi zrobić, to czas kompilacji . Nie wymaga żadnych danych wejściowych od użytkownika, a jego obliczenia nie są oparte na instancji. Wszystko w tym opiera się na klasie / schemacie — co jest unikalne, tzn. Nie masz wielu schematów dla jednej klasy. Czy możesz mieć różne odmiany w czasie kompilacji? Nie, dlatego klasa jest unikalna, więc niezależnie od tego, ile razy wywołasz metodę klasową, wskaźnik do niej będzie taki sam.
Metoda wystąpienia
Wręcz przeciwnie, metoda występuje w czasie wykonywania, ponieważ dopiero wtedy utworzono instancję czegoś, co może zmieniać się przy każdej instancji.
Jeśli pochodzisz z innych języków, metody statyczne są takie same jak metody klasowe.
Jeśli pochodzisz z Swift, metody typowania są takie same jak metody klasowe.
źródło
Dodanie do powyższych odpowiedzi
Metoda klasy będzie działać na klasie, użyjemy jej do ogólnego celu, gdzie jak + stringWithFormat, rozmiar klasy i co najważniejsze dla init itp
Metoda instancji będzie działać na instancji klasy, a nie na klasie, tak jak mamy dwie osoby i chcemy poznać bilans każdej z nich osobno, tutaj musimy użyć metody instancji. Ponieważ nie zwróci ogólnej odpowiedzi. np. jak określić liczbę NSSArray itp.
źródło