2010-06-30 29 views

Odpowiedz

12

Używając analogii zmęczony stary samochód ...

myśleć o klasie jak to jest fabryka, która sprawia, że ​​instancje klasy. Na przykład, możesz mieć klasę samochodu i może zadeklarować metodę jak:

+ carWithColor: (NSColor *) aColor; 

i że metoda będzie następnie utworzyć nową instancję samochód, ustawienia koloru, i odesłać go:

+ carWithColor: (NSColor *) aColor 
{ 
    Car *aCar = [[[self alloc] init] autorelease]; 
    [aCar paintWithColor: aColor]; 
    return aCar; 
} 

Teraz klasa samochodów zadeklaruje metodę instancji, która umożliwi namalowanie samochodu. Dlaczego metoda instancji? Ponieważ każdy samochód może mieć inny kolor (a kolor samochodu będzie prawdopodobnie przechowywany w zmiennej instancji).

- (void) paintWithColor: (NSColor *) aColor 
{ 
    ... do your paint stuff here ... 
} 

Zostało to wyjaśnione w sekcjidokumentacji Objective-C.

-1

metoda klasy podpisy są prefiksem +, metody instancji z - tak w swoich deklaracjach plików nagłówkowych będzie wyglądać mniej więcej tak:

-(void)setAllThings:(NSArray*)things; //instance method 
+(void)setAllClassThings:(NSArray*)things; //class method 

I oczywiście mają zastosowanie te same zasady podczas definiowania metod w. m plik.

+0

znam sposób ich deklaracji oraz składnię. Ale nie znam pojęcia, dlaczego potrzebujemy zastosować metodę klas i metodę instancji? – Tirth

+1

iHungry, pomyśl o tym, kiedy nie potrzebujesz instancji obiektu, ustaw setter lub getter, a może uzyskasz coś wyprowadzonego bez zainicjowania obiektu, wtedy metody klasowe się przydadzą. Ponieważ alokacja i inicjalizacja metod klasowych odbywa się w tle, można wywołać metodę klasy i uzyskać zwrot w jakiejś formie, bez inicjowania obiektu i przechodzenia przez ten proces bolesny przydziału, init i wydania. Jeśli zauważysz w domyślnym nagłówku systemu iOS, zauważysz, że większość metod klasy zwraca obiekt. – kforkarim

0

Instance sposoby robienia rzeczy z przypadkach klasy:

NSString *myString; 
myString = [[[NSString alloc] initWithString:@"Hello, world."] autorelease]; 
NSLog (@"myString's length: %u", [myString length]); // instance method 

klasy metody mogą zrobić klasy specyficzne rzeczy bez polegania na instancji obiektu, często wracając instancję klasa lub inny wynik specyficzny dla klasy:

NSLog (@"%@", [NSString stringWithString:@"Hello, world."]); // class method 

I t Hink To może być rzadkie, aby zobaczyć metody klasy, które nie zwracają czegoś.

+0

Jednym z przykładów metody klasy, która niczego nie zwraca jest "[UIView + setAnimationsEnabled:]" - to znaczy, metoda klasy może zastosować zmiany we wszystkich instancjach. –

0

Nie trzeba implementować obu. Obie opcje są dostępne podczas projektowania klasy.

Metoda instancji może działać na instancji klasy. Może to uzyskać lub ustawić właściwość lub spowodować zachowanie, które ma wykonywać tylko ta instancja. Musisz mieć instancję, aby z niego skorzystać. Mogą one użyć lub zmienić stan instancji.

// Notional instance methods 
myHouse.color = blueColor; 

[myCar accelerate]; 
speed = myCar.speed; 

Metoda klasy działa na zasadzie, że klasa istnieje. Można go użyć do utworzenia instancji lub wykonać obliczenia, które nie zależy od posiadania instancji. Możesz mieć klasę dla niestandardowego pomocnika matematycznego, która zasadniczo zawiera funkcje.

// Notional class method uses 
myString = [NSString stringWithFormat:@"&f", floatToConvert]; 

myResult = [MyMathHelper MyFunctionWithInput:myInput]; 
6

To jest stary post, ale ponieważ pojawia się jako pierwszy w wyszukiwarce Google, pomyślałem, że dodam do niego.

Nie będę mówić o metodach klas używanych jako metody fabryczne. Chciałbym porozmawiać o ich zastosowaniu w metodach użytkowych.Możesz/powinieneś używać metod klasowych dla metod użyteczności, które są niezależne od stanu. Co to znaczy? Na przykład, jeśli formatujesz datę w taki sam sposób dla wszystkich instancji, jest to metoda użyteczna, która powinna być metodą klasy. Pomyśl o metodzie użyteczności, takiej jak śrubokręt. Nie musisz tworzyć nowej instancji wkrętarki za każdym razem, gdy chcesz coś z nią zrobić. Śrubokręt pozostaje stały. Tak więc, na przykład, mam klasę, która zawiera prywatną metodę, która generuje ciąg emDashów używanych do wyświetlania w widoku. Ta metoda nie jest zależna od stanu i dlatego nie będzie się różnić w zależności od instancji. Pomyśl o metodach użyteczności klas, takich jak stałe.

+ (NSString *)emDashString { 
return @" \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014 \u2014"; 

}

można wywołać tej metody ogólnie w obrębie klasy (to prywatny w moim przykładzie) tak:

NSString *string = [[self class] emDashString ]; 

ja celowo nieco trywialny przykład poprowadź punkt do domu. Będziesz tylko zawracał sobie głowę tworzeniem tej metody klasy, jeśli będziesz potrzebował tego ciągu więcej niż jeden raz w swojej klasie. Zauważ, że zamiast odwoływać się do klasy po nazwie, nazywam ją ogólną z [self class], ponieważ jest ona wewnętrznie nazywana. Jeśli jest odsłonięty i chcesz go wywołać z innej klasy, odnieś się do niego po nazwie klasy, jak zwykle.

+0

Podoba mi się to wyjaśnienie lepiej niż pomysł Fabryki. W końcu instancja samochodu może zostać utworzona za pomocą: Car * car = [[Car alloc] init]; Następnie pomalowano inną metodą instancji, więc nie widzę analogii z Factory jako bardzo użytecznej. Ale idea state/stateless jest bardzo użyteczna i używa metod Class do zwracania wartości, które są stałe. Doskonałe wyjaśnienie. –

+0

Przypuszczam, że w przypadku wywoływania metody klasy mniej jest narzut, dlatego ważne jest, aby zrozumieć, kiedy z nich korzystać. –

Powiązane problemy