Vývoj aplikácií pre Macintosh si vyžaduje kreativitu, programovacie zručnosti v Objective-C, určitú trpezlivosť a dobrú vytrvalosť pri implementácii, vylepšovaní a poskytovaní vašej aplikácie pre Macintosh v dobrom funkčnom stave vašim používateľom. Na ceste do tohto cieľa narazíte na niekoľko výziev, ktoré preveria vaše schopnosti programovania a riešenia problémov. Musíte sa vyrovnať (okrem iného) s používaním delegátov na implementáciu spätných volaní aplikácií; používanie non-Objective-C frameworkov od Apple; a začlenenie kódu C++ do vašich aplikácií.
Implementácia spätných volaní v aplikáciách Macintosh
Vývoj aplikácií pre systém Macintosh využíva spätné volania, aby umožnil systému Mac OS X spustiť kód vo vašej aplikácii pre konkrétne operácie. Ak vytvárate štandardnú aplikáciu založenú na okne alebo dokumentoch pre Macintosh, úplne prvý kód, ktorý OS X spustí, je v jednej z nasledujúcich metód spätného volania, ktoré musíte pre svoju aplikáciu vytvoriť v závislosti od dizajnu aplikácie:
Spätné volanie je jednoducho metóda, ktorú OS nakoniec vykoná, keď sa pokúša dodať alebo získať informácie z vašej aplikácie. Kód vašej aplikácie spustí metódu pre triedu kakaa, kde bude mať vaša aplikácia možnosť poskytnúť názov metódy jednej z vašich tried, ktorá sa má vyvolať na objekte triedy, ktorú bude musieť poskytnúť aj vaša aplikácia.
Delegát je objekt pomocníka, ktorý trieda Cocoa používa na rozšírenie funkčnosti triedy tým, že umožňuje implementovať kód, ktorý trieda Cocoa bude spúšťať za určitých okolností. Trieda kakaa kontroluje svoj objekt delegáta (ak bol priradený), či delegát poskytuje implementáciu špecifickej metódy. Ak má delegát túto metódu, trieda Cocoa túto metódu vykoná; ak delegát neimplementuje túto špecifickú metódu, trieda Cocoa buď použije vlastnú predvolenú metódu, alebo zaznamená chybu. Väčšina delegátov musí začleniť konkrétny protokol, ktorý určuje, aké metódy môžu implementovať; delegáti vášho kódu musia používať metódy implementácie zo špecifického protokolu, ktorý delegát očakáva.
Tu sú niektoré z objektov kakaa, ktoré môžu použiť delegátov na spustenie vášho kódu:
-
NSTableView. NSTableView akceptuje delegáta, ktorý sa riadi protokolom NSTableViewDelegate. To zahŕňa 20 až 30 metód, ktoré môže implementovať objekt delegáta vašej aplikácie, aby podporil potrebu vašej aplikácie vedieť, čo robí NSTableView. Existujú metódy, ktoré sa zavolajú vo vašej aplikácii, keď potrebuje poznať akciu a reagovať na ňu, napríklad keď používateľ urobí výber v tabuľke alebo keď sa zmení veľkosť stĺpca.
-
Aplikácia NSA. Môžete priradiť NSApplicationDelegate na obsluhu niektorých metód, ktoré inštancia NSApplication (vaša aplikácia) dostane. Tieto metódy možno volať tesne pred alebo hneď po tom, ako vaša aplikácia vykoná inú metódu, aby sa vaša aplikácia dala pripraviť.
-
NSWindow. Funkcia NSWindowDelegate priradená jednému z okien vašej aplikácie umožní vašej aplikácii reagovať na zmenu veľkosti, presun alebo iné udalosti v okne používateľa.
-
NSMenu. Implementujete NSMenuDelegate na podporu udalostí, ku ktorým dochádza, keď používateľ interaguje s ponukami vo vašej aplikácii.
Non-Objective-C Frameworks v aplikáciách Macintosh
Spoločnosť Apple poskytuje mnoho rámcov na vývoj aplikácií pre počítače Macintosh (knižnice kódov), ktoré môže vaša aplikácia volať na vykonávanie tisícok operácií v systéme OS X. Mnohé z týchto rámcov, ako napríklad súprava PDF, pozostávajú z tried Objective-C, z ktorých môže vaša aplikácia vytvárať a používať objekty vo svojich aplikáciách. Niektoré z týchto rámcov sú však len knižnice funkcií, ktoré môže vaša aplikácia vykonávať.
Rámec CFNetwork je napríklad súbor funkcií, ktoré môže vaša aplikácia použiť na vykonávanie vyladených sieťových pripojení. Trieda NSURL poskytuje dobrý súbor základných sieťových operácií, ktoré sú skvelé na získavanie údajov pomocou adresy URL. Ak vaša aplikácia vyžaduje väčšiu kontrolu nad sieťovou komunikáciou, ktorú spúšťa, budete musieť použiť rámec CFNetwork a jeho funkcie. Na prípravu požiadavky HTTP na prenos na konkrétnu adresu URL môžete použiť nasledujúci kód:
CFStringRef httpBody = CFSTR( ");
CFStringRef headerFieldName = CFSTR( "Cookie" ); // pridanie konkrétneho súboru cookie do požiadavky HTTP
CFStringRef headerFieldValue = CFSTR( "loginID=moje_pouzivatelske_meno; heslo=moje_heslo;" );
CFStringRef url = CFSTR( "www.diabeticpad.com" );
CFURLRef urlRef = CFURLCreateWithStrign( kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR( "GET" );
CFHTTPMessageRef request = CFHTTPMessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody( požiadavka, httpBody );
// pridajte koláčik
CFHTTPMessageSetHeaderFieldValue( požiadavka, hlavičkaFieldName, headerFieldValue);
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage(požiadavka);
Keď bude mať váš kód serializovanú požiadavku, vaša aplikácia môže otvoriť stream zápisu, aby doručila požiadavku na miesto určenia.
Všetky rámce Apple založené na C poskytujú súbor funkcií na vykonávanie tohto typu programovania nižšej úrovne. Váš kód bude komplikovanejší, ale Apple neposkytuje triedy Objective-C pre všetky svoje rámce. Ak skutočne potrebujete funkcie dostupné v jednom z týchto rámcov, je to jediný spôsob, ako môžete dosiahnuť ciele svojej aplikácie. Nasledujúce rámce neposkytujú triedy Objective-C:
Ak chcete vytvárať aplikácie, ktoré dokážu naplno využívať funkcie OS X, musíte byť pripravení podporovať používanie knižníc kódov, ktoré nie sú Objective-C.
C++ kód v Objective-C Macintosh aplikáciách
Objective-C poskytuje objektovo orientované funkcie pre vývoj aplikácií pre Macintosh, ako napríklad dedičnosť a polymorfizmus. Jazyk je založený na programovacom jazyku C; preto môžete použiť svoje znalosti programovania v jazyku C na kódovanie v rámci Objective-C. Objective-C++ je premosťovací mechanizmus, ktorý umožňuje zdrojovým modulom Objective-C pracovať s triedami Objective-C++, ktoré môžu kompilovať a prepojiť s knižnicami kódu C++.
Nasledujúci jednoduchý príklad štvorcovej matice ukazuje obsah hlavičkového súboru C++ pre triedu Matrix. Trieda Matrix prichádza so štandardným konštruktorom a deštruktorom pre triedu C++ a metódy sú také, aké by ste očakávali od základného objektu štvorcovej matice:
triedy Matrix
{
verejné:
Matrix( int inSize );
virtuálny ~Matrix();
int getSize( void );
int getDeterminant( void );
void setElement( int inRow, int inCol, int inValue );
int getElement( int inRow, int inCol );
Maticový operátor+( const Matrix& inAddend );
súkromné:
int m_veľkosť;
int[][] m_elements;
};
Ak chcete používať Objective-C++, vaše moduly triedy Objective-C++ musia používať príponu súboru .mm. Toto povie kompilátoru Xcode, že trieda sa má skompilovať pomocou Objective-C++, čo vašej triede umožní používať kľúčové slová jazyka C++. Pomocou Objective-C++ môže vaša aplikácia vytvoriť objekt Matrix na vykonávanie základných operácií, ako je napríklad pridanie dvoch objektov Matrix dohromady. To predpokladá, že zdrojový modul Objective-C++ #importoval súbor C++ Matrix.h:
- (void)addTwoMatrices
{
Maticová matica Jedna ( 3 ); // Matica 3x3
Maticová maticaDva( 3 ); // ďalší
int riadokIndex = 0;
int colIndex = 0;
pre (rowIndex=0; rowIndex<3; ++rowIndex)
{
for (colIndex=0; colIndex<3; ++colIndex)
{
// nastavenie prvkov matice na ich hodnoty
matrixOne.setElement( rowIndex, colIndex, XXX );
// nastaví prvky matice dva na iné hodnoty
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
Maticová maticaSúčet = maticaJedna + maticaDva;
S Objective-C++ môžu vaše aplikácie využívať všetky dostupné knižnice tretích strán napísané pre C++.