Nastal čas na kakao - Základní služby objektů - MujMAC.cz - Apple, Mac OS X, Apple iPod

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Jaký fotograf/ka získal/a cenu za nejpopulárnější příspěvek v Nikon Photo Contest?

V dnešní soutěži hrajeme o:

Seriály

Více seriálů



Začínáme s

Nastal čas na kakao - Základní služby objektů

18. června 2004, 00.00 | Ačkoli Objective C na rozdíl např. od Javy nevyžaduje striktně, aby každá třída, již vytváříme, měla nadtřídu, v praxi budeme téměř vždy své třídy odvozovat od standardní kořenové třídy NSObject – nebo od tříd, jež jsou samy jejími dědici. Vyplatí se proto se hned zpočátku podrobněji podívat na metody, jež od třídy NSObject prakticky všechny objekty dědí.

Ačkoli Objective C na rozdíl např. od Javy nevyžaduje striktně, aby každá třída, již vytváříme, měla nadtřídu, v praxi budeme téměř vždy své třídy odvozovat od standardní kořenové třídy NSObject – nebo od tříd, jež jsou samy jejími dědici. Vyplatí se proto se hned zpočátku podrobněji podívat na metody, jež od třídy NSObject prakticky všechny objekty dědí – a jež tedy můžeme sami ve svých třídách i při komunikaci s jinými objekty (pokud jsou dědici NSObject) využívat. My už známe takovéto metody alloc, init, a také – ačkoli jsme si explicitně neřekli, že jde o metody zděděné od třídy NSObject – metody pro správu paměti retain, autorelease a release. Dnes se seznámíme s několika dalšími.

V tomto článku se na metody podíváme jen orientačně, a nebudeme si je popisovat do hloubky; také se nebudeme učit, jak je správně implementovat v našich vlastních třídách: to bude tématem dalších pokračování, kde se budeme věnovat jednotlivým úkolům a možnostem podrobně.

Nezapomínejme také, že kořenová třída má zvláštní postavení v tom smyslu, že její instanční metody se prohledávají i v případě, že některou zprávu dostane sama třída. Budeme-li se tedy bavit např. o (instanční) metodě class, plyne z toho nejen to, že zprávu class můžeme poslat libovolné instanci, ale i to, že ji můžeme poslat také libovolné třídě.

Obecné služby

-(NSString*)description

Po přijetí zprávy description objekt vrátí svůj textový popis. Různé objekty samozřejmě mohou být popsány různým způsobem – pro objekty representující hodnoty (NSString, NSNumber) je obvykle popisem jejich skutečný obsah, složené objekty (NSArray, NSDictionary) rekursivně vypíší objekty, jež obsahují...

Minimem je zobrazení třídy objektu a jeho adresy.

-(BOOL)isEqual:object
-(unsigned)hash

Zprávy isEqual: a hash slouží pro vzájemné porovnávání objektů: hash vrací jen orientační číslo, representující hodnotu objektu ve smyslu definovaném hashovací tabulkou (tj. totožné objekty musejí mít totožný hash; různé objekty mohou mít hash totožný také, ale čím častěji se liší hashe různých objektů, tím je práce s tabulkou efektivnější).

Zpráva isEqual: ověří, zda jsou dva objekty ekvivalentní nebo ne. Ekvivalence objektů je definována právě metodou isEqual:; u hodnotových objektů se samozřejmě porovnávají hodnoty (tedy například dva různé textové objekty, jež obsahují stejný textový řetězec, jsou ekvivalentní). Ostatní objekty definují isEqual: podle potřeby; kontejnery obvykle rekursivně použijí isEqual: na objekty, jež obsahují, a vrátí YES pouze v případě, že je ekvivalentní jejich obsah.

Hierarchie tříd

-(Class)class
-(Class)superclass

Základní zpráva class prostě vrátí třídu, jejíž instanci jsme zprávu poslali. Pošleme-li zprávu třídě, vrátí prostě self (tedy sebe sama) – nejjednodušší způsob, jak získat třídu, je použít výraz [jménotřídy class].

Druhá zpráva slouží k vyhledání nadtřídy; pokud žádná neexistuje (pošleme-li zprávu superclass kořenové třídě), dostaneme hodnotu Nil.

-(BOOL)isKindOfClass:(Class)class
+(BOOL)isSubclassOfClass:(Class)class

Zpráva isKindOfClass: umožňuje ověřit, zda je daná instance skutečně instancí požadované třídy (nebo některé z jejích podtříd – to je velmi důležité, vzpomeňte si třeba na sdružené třídy s jejich skrytými podtřídami) nebo ne. Pozor; to, že máme tuto možnost k dispozici, svádí k psaní "polymorfních" metod a funkcí, jež v řadě ifů ověřují, je-li jejich argument té či oné třídy, a podle výsledku zvolí odpovídající činnost: v některých konkrétních případech to může být na místě, avšak obecně to je špatný objektový návrh, na jehož místě je lépe využít přímo polymorfismu a – případně – kategorií (konkrétní příklady si ukážeme v pozdějších dílech našeho seriálu, až se budeme věnovat správným vzorcům objektového programování).

Zprávu isKindOfClass: nelze posílat třídám (přesně řečeno, samozřejmě lze, avšak výsledek nemá příliš dobrý smysl – každá třída je z hlediska zprávy isKindOfClass: "podtřídou" kořenové třídy NSObject, neboť implementuje její instanční metody, a to je vše). Proto máme k dispozici také zprávu isSubclassOfClass:, jež umožňuje pro danou třídu ověřit, je-li podtřídou požadované třídy (nebo přímo požadovanou třídou), nebo ne.

Schopnost reagovat na určené zprávy

-(BOOL)respondsToSelector:(SEL)selector
+(BOOL)instancesRespondToSelector:(SEL)selector
-(BOOL)conformsToProcotol:(Protocol*)protocol

O metodě conformsToProcotol: již jsme se zmínili, když jsme si vysvětlovali, jak vypadají a fungují protokoly: jejím prostřednictvím můžeme ověřit, zda instance nebo třída odpovídá danému protokolu – jinými slovy, zda se můžeme spolehnout, že bude rozumět všem zprávám, jež jsou v protokolu deklarovány.

Metoda respondsToSelector: má obdobné využití, ověřuje však schopnost reagovat na jednu konkrétní zprávu, určenou prostřednictvím selektoru. Alternativní metoda instancesRespondToSelector: umožňuje zjistit přímým dotazem třídě, zda její instance budou rozumět dané zprávě (pošleme-li třídě zprávu respondsToSelector:, dozvíme se, zda dané zprávě rozumí třída sama).

Nepřímé provedení zprávy

Následující skupina metod – poslední, o nichž se dnes zmíníme – umožňuje vyžádat si od objektu provedení zprávy, jejíž selektor je uložen v proměnné:

-performSelector:(SEL)selector
-performSelector:(SEL)selector withObject:o
-performSelector:(SEL)selector withObject:o1 withObject:o2

První trojice metod prostě pošle objektu zprávu s odpovídajícím selektorem a žádným, jedním či dvěma argumenty. Pokud bychom chtěli nepřímo posílat zprávy s větším počtem argumentů, nebo jejichž argumenty či návratová hodnota nejsou objekty, museli bychom použít služby třídy NSInvocation – i tu si časem ukážeme, ale protože jde o poměrně speciální službu užívanou relativně zřídkakdy, bude to až později.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Informace  

 » Rubriky  » Agregator  

 » Rubriky  » Začínáme s  

 

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: