Razvoj Macintosh aplikacija zahtijeva kreativnost, vještine programiranja Objective-C, malo strpljenja i lijepu upornost za implementaciju, usavršavanje i isporuku vaše Macintosh aplikacije u dobrom radnom stanju vašim korisnicima. Na svom putu do ovog odredišta naići ćete na izazove koji će testirati vaše vještine programiranja i rješavanja problema. Morate se uhvatiti u koštac (između ostalog) s korištenjem delegata za implementaciju povratnih poziva aplikacije; korištenje ne-Objective-C okvira iz Applea; i ugrađivanje C++ koda u svoje aplikacije.
Implementacija povratnih poziva u Macintosh aplikacijama
Razvoj Macintosh aplikacija koristi povratne pozive kako bi omogućio Mac OS X izvršavanje koda unutar vaše aplikacije za određene operacije. Ako stvarate standardnu aplikaciju temeljenu na prozoru ili dokumentu za Macintosh, prvi kod koji će OS X izvršiti je u jednoj od sljedećih metoda povratnog poziva koje morate izraditi za svoju aplikaciju, ovisno o dizajnu aplikacije:
-
Aplikacije koje se temelje na prozoru: (void)applicationDidFinishLaunching:(NSNotification*)aNotification
-
Aplikacije temeljene na dokumentu: (void)windowControllerDidLoadNib:(NSWindowController*)windowController
Povratni poziv jednostavno je metoda koju OS na kraju izvršava dok pokušava dostaviti ili dohvatiti informacije iz vaše aplikacije. Vaš će kod aplikacije izvršiti metodu za klasu Cocoa gdje će vaša aplikacija imati priliku dati naziv metode jedne od vaših klasa, koja će biti pozvana na objektu te klase koju će vaša aplikacija također morati pružiti.
Delegat je pomoćni objekt, kojem je kakao klasa koristi proširiti funkcionalnost klase omogućujući vam da provesti kod kojih je kakao klasa će izvršiti u određenim okolnostima. Klasa Cocoa provjerava svoj objekt delegata (ako je dodijeljen) daje li delegat implementaciju određene metode. Ako delegat ima tu metodu, klasa Cocoa izvršava tu metodu; ako delegat ne implementira tu specifičnu metodu, klasa Cocoa ili koristi vlastitu zadanu metodu ili bilježi pogrešku. Većina delegata mora uključiti određeni protokol koji određuje koje metode mogu implementirati; delegati vašeg koda moraju koristiti metode implementacije iz specifičnog protokola koji delegat očekuje.
Evo nekih objekata Cocoa koji mogu koristiti delegate za izvršavanje vašeg koda:
-
NSTableView. NSTableView prihvaća delegata koji poštuje NSTableViewDelegate protokol. To uključuje 20 do 30 metoda koje delegatski objekt vaše aplikacije može implementirati kako bi podržao potrebu vaše aplikacije da zna što radi NSTableView. Postoje metode koje će se pozvati u vašoj aplikaciji kada treba znati i reagirati na radnju, kao što je kada korisnik napravi odabir u tablici ili kada se promijeni veličina stupca.
-
NSA aplikacija. Možete dodijeliti NSApplicationDelegate za rukovanje nekim metodama koje će NSApplication instanca (vaša aplikacija) primiti. Te se metode mogu pozvati neposredno prije ili neposredno nakon što vaša aplikacija izvrši drugu metodu, tako da se vaša aplikacija može pripremiti.
-
NSWindow. NSWindowDelegate dodijeljen jednom od prozora vaše aplikacije dat će vašoj aplikaciji priliku da odgovori na korisnikovu promjenu veličine, premještanje ili druge događaje prozora.
-
NSMenu. NsMenuDelegate implementirate za podršku događajima koji se događaju kada korisnik stupi u interakciju s izbornicima u vašoj aplikaciji.
Non-Objective-C okviri u Macintosh aplikacijama
Apple nudi mnoge Macintosh okvire za razvoj aplikacija (biblioteke kodova) koje vaša aplikacija može pozvati za izvođenje tisuća operacija u OS X. Mnogi od tih okvira, kao što je PDF Kit, sastoje se od Objective-C klasa, iz kojih vaša aplikacija može kreirajte i koristite objekte unutar svojih aplikacija. Međutim, neki od ovih okvira samo su biblioteke funkcija koje vaša aplikacija može izvršiti.
Na primjer, okvir CFNetwork je skup funkcija koje vaša aplikacija može koristiti za izvođenje fino podešenih mrežnih veza. Klasa NSURL pruža dobar skup osnovnih mrežnih operacija koje su izvrsne za dohvaćanje podataka pomoću URL-a. Ako vaša aplikacija zahtijeva veću kontrolu nad mrežnom komunikacijom koju pokreće, morat ćete koristiti okvir CFNetwork i njegove funkcije. Možete koristiti sljedeći kod za pripremu HTTP zahtjeva za prijenos na određeni URL:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR( "Kolačić"); // dodaj određeni kolačić u HTTP zahtjev
CFStringRef headerFieldValue = CFSTR( "loginID=my_user_name; password=my_password;");
CFStringRef url = CFSTR( "www.diabeticpad.com");
CFURLRef urlRef = CFURLCreateWithStrign( kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR( "GET");
CFHTTPMessageRef zahtjev = CFHTTPMessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody( zahtjev, httpBody);
// dodaj kolačić
CFHTTPMessageSetHeaderFieldValue(zahtjev, zaglavljeImeFieldName, HeaderFieldValue);
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage( zahtjev);
Nakon što vaš kod ima serijalizirani zahtjev, vaša aplikacija može otvoriti stream za pisanje kako bi zahtjev isporučila na njegovo odredište.
Svi Appleovi okviri temeljeni na C-u pružaju skup funkcija za izvođenje ove vrste programiranja niže razine. Vaš će kod postati kompliciraniji, ali Apple ne nudi Objective-C klase za sve svoje okvire. Ako stvarno trebate funkcionalnost dostupnu u jednom od tih okvira, to je jedini način na koji možete postići ciljeve svoje aplikacije. Sljedeći okviri ne pružaju Objective-C klase:
Ako želite stvoriti aplikacije koje mogu u potpunosti iskoristiti značajke OS X, morate biti spremni podržati korištenje knjižnica kodova koji nisu Objective-C.
C++ kod u Objective-C Macintosh aplikacijama
Objective-C pruža objektno orijentirane značajke za razvoj Macintosh aplikacija, kao što su nasljeđivanje i polimorfizam. Jezik se temelji na programskom jeziku C; stoga možete koristiti svoje znanje programiranja C za kodiranje unutar Objective-C. Objective-C++ je mehanizam za premošćivanje koji omogućuje Objective-C izvornim modulima da rade s Objective-C++ klasama, koje se mogu kompilirati i povezati s C++ knjižnicama koda.
Sljedeći jednostavan primjer kvadratne matrice prikazuje sadržaj C++ datoteke zaglavlja za klasu Matrix. Klasa Matrix dolazi sa standardnim konstruktorom i destruktorom za klasu C++, a metode su ono što biste očekivali za osnovni kvadratni matrični objekt:
razred Matrix
{
javnost:
Matrica (int inSize);
virtualni ~Matrix();
int getSize( void);
int getDeterminant( void);
void setElement( int inRow, int inCol, int inValue);
int getElement( int inRow, int inCol);
Operator matrice+( const Matrix& inAddend );
privatni:
int m_veličina;
int[][] m_elementi;
};
Da biste koristili Objective-C++, vaši moduli klase Objective-C++ moraju koristiti ekstenziju datoteke .mm. Ovo govori Xcode-ovom prevodiocu da se klasa treba prevesti korištenjem Objective-C++, što će vašoj klasi omogućiti korištenje ključnih riječi C++ jezika. Koristeći Objective-C++, vaša aplikacija može stvoriti Matrix objekt za izvođenje osnovnih operacija, kao što je dodavanje dva Matrix objekta zajedno. Ovo pretpostavlja da je izvorni modul Objective-C++ #importirao datoteku C++ Matrix.h:
- (void)addTwoMatrices
{
Matrix matrixOne(3); // 3x3 matrica
Matrica matricaDva(3); // drugo
int indeks reda = 0;
int colIndex = 0;
za (indeks reda=0; indeks reda<3; ++indeks redaka)
{
za (colIndex=0; colIndex<3; ++colIndex)
{
// postaviti svoje elemente matrice na njihove vrijednosti
matrixOne.setElement( rowIndex, colIndex, XXX);
// postavlja elemente matrice dva na neke druge vrijednosti
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
Zbroj matrice matrice = matricaJedan + matricaDva;
Uz Objective-C++, vaše aplikacije mogu iskoristiti prednosti svih dostupnih biblioteka trećih strana napisanih za C++.