Razvoj aplikacij Macintosh zahteva ustvarjalnost, spretnosti programiranja Objective-C, nekaj potrpljenja in lepo pomoč pri vztrajnosti za implementacijo, izboljšanje in dostavo vaše aplikacije Macintosh v dobrem stanju vašim uporabnikom. Na poti do tega cilja boste naleteli na nekaj izzivov, ki bodo preizkusili vaše sposobnosti programiranja in reševanja problemov. Morate se spopasti z (med drugim) uporabo delegatov za izvajanje povratnih klicev aplikacij; uporaba Applovih okvirjev, ki niso Objective-C; in vključitev kode C++ v svoje aplikacije.
Implementacija povratnih klicev v aplikacijah Macintosh
Razvoj aplikacij za Macintosh uporablja povratne klice, da omogoči Mac OS X, da izvede kodo v vaši aplikaciji za določene operacije. Če ustvarjate standardno aplikacijo Macintosh, ki temelji na oknu ali dokumentu, je prva koda, ki jo bo izvedel OS X, v enem od naslednjih načinov povratnega klica, ki jih morate ustvariti za svojo aplikacijo, odvisno od zasnove aplikacije:
-
Aplikacije, ki temeljijo na oknu: (void)applicationDidFinishLaunching:(NSNotification*)aNotification
-
Aplikacije, ki temeljijo na dokumentih: (void)windowControllerDidLoadNib:(NSWindowController*)windowController
Povratni klic je preprosto metoda, ki jo OS na koncu izvede, medtem ko poskuša zagotoviti ali pridobiti informacije iz vaše aplikacije. Vaša programska koda bo izvedla metodo za razred Cocoa, kjer bo vaša aplikacija imela možnost zagotoviti ime metode enega od vaših razredov, ki bo poklicana na objektu tega razreda, ki ga bo morala zagotoviti tudi vaša aplikacija.
Delegat je pomočnik predmet, katerega kakav razred uporablja za razširitev funkcionalnosti razreda, ki vam omogoča, da izvajanje kode, ki bodo razred kakav izvede v določenih okoliščinah. Razred Cocoa preveri svoj objekt delegata (če je bil dodeljen), ali pooblaščenec zagotavlja izvedbo določene metode. Če ima delegat to metodo, razred Cocoa to metodo izvede; če delegat ne implementira te posebne metode, razred Cocoa bodisi uporabi lastno privzeto metodo ali zabeleži napako. Večina delegatov mora vključiti poseben protokol, ki določa, katere metode lahko izvajajo; delegati vaše kode morajo uporabljati metode implementacije iz posebnega protokola, ki ga pooblaščenec pričakuje.
Tukaj je nekaj objektov Cocoa, ki lahko uporabljajo delegate za izvajanje vaše kode:
-
NSTableView. NSTableView sprejme pooblaščenca, ki upošteva protokol NSTableViewDelegate. To vključuje 20 do 30 metod, ki jih lahko izvaja pooblaščeni objekt vaše aplikacije, da podpre potrebo vaše aplikacije, da ve, kaj počne NSTableView. Obstajajo metode, ki bodo poklicane v vaši aplikaciji, ko mora vedeti in se odzvati na dejanje, na primer, ko uporabnik naredi izbiro v tabeli ali ko se spremeni velikost stolpca.
-
NSA aplikacija. NSApplicationDelegate lahko dodelite za obdelavo nekaterih metod, ki jih bo prejel primerek NSApplication (vaša aplikacija). Te metode se lahko pokličejo tik pred ali takoj po tem, ko vaša aplikacija izvede drugo metodo, tako da se lahko vaša aplikacija pripravi.
-
NSWindow. NSWindowDelegate, dodeljen enemu od oken vaše aplikacije, bo vaši aplikaciji dal možnost, da se odzove na uporabnikovo spreminjanje velikosti, premikanje ali druge dogodke okna.
-
NSMenu. NSMenuDelegate implementirate za podporo dogodkov, ki se zgodijo, ko uporabnik komunicira z meniji v vaši aplikaciji.
Non-Objective-C Frameworks v aplikacijah Macintosh
Apple ponuja veliko ogrodij za razvoj aplikacij za Macintosh (knjižnice kod), ki jih lahko pokliče vaša aplikacija za izvajanje na tisoče operacij v OS X. Številni od teh okvirov, kot je PDF Kit, so sestavljeni iz razredov Objective-C, iz katerih lahko vaša aplikacija ustvarite in uporabite predmete v svojih aplikacijah. Vendar pa so nekateri od teh okvirov le knjižnice funkcij, ki jih lahko izvaja vaša aplikacija.
Na primer, okvir CFNetwork je nabor funkcij, ki jih lahko vaša aplikacija uporablja za izvajanje natančno nastavljenih omrežnih povezav. Razred NSURL ponuja dober nabor osnovnih omrežnih operacij, ki so odlični za pridobivanje podatkov z uporabo URL-ja. Če vaša aplikacija zahteva več nadzora nad omrežnimi komunikacijami, ki jih sproži, boste morali uporabiti okvir CFNetwork in njegove funkcije. Za pripravo zahteve HTTP za prenos na določen URL lahko uporabite naslednjo kodo:
CFStringRef httpBody = CFSTR( ");
CFStringRef headerFieldName = CFSTR( "Piškotek"); // zahtevi HTTP dodamo določen piškotek
CFStringRef headerFieldValue = CFSTR( "ID za prijavo=moje_uporabniško ime; geslo=moje_geslo;");
CFStringRef url = CFSTR( "www.diabeticpad.com");
CFURLRef urlRef = CFURLCreateWithStrign( kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR( "GET");
Zahteva CFHTTPMessageRef = CFHTTPMessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody( zahteva, httpBody);
// dodaj piškotek
CFHTTPMessageSetHeaderFieldValue( zahteva, headerFieldName, headerFieldValue);
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage(zahteva);
Ko ima vaša koda serijsko zahtevo, lahko vaša aplikacija odpre tok pisanja, da dostavi zahtevo na njen cilj.
Vsa ogrodja Apple, ki temeljijo na C, zagotavljajo nabor funkcij za izvajanje te vrste programiranja na nižji ravni. Vaša koda bo postala bolj zapletena, vendar Apple ne zagotavlja razredov Objective-C za vse svoje okvire. Če resnično potrebujete funkcionalnost, ki je na voljo v enem od teh okvirov, je to edini način, da dosežete cilje svoje aplikacije. Naslednji okvirji ne zagotavljajo razredov Objective-C:
Če želite ustvariti aplikacije, ki lahko v celoti izkoristijo funkcije OS X, morate biti pripravljeni podpreti uporabo knjižnic kod, ki niso Objective-C.
Koda C++ v aplikacijah Objective-C Macintosh
Objective-C ponuja objektno usmerjene funkcije za razvoj aplikacij Macintosh, kot sta dedovanje in polimorfizem. Jezik temelji na programskem jeziku C; zato lahko svoje znanje programiranja C uporabite za kodiranje znotraj Objective-C. Objective-C++ je premostitveni mehanizem, ki izvornim modulom Objective-C omogoča delo z razredi Objective-C++, ki se lahko prevedejo in povežejo s kodnimi knjižnicami C++.
Naslednji preprost primer kvadratne matrike prikazuje vsebino datoteke glave C++ za razred Matrix. Razred Matrix je opremljen s standardnim konstruktorjem in destruktorjem za razred C++, metode pa so tisto, kar bi pričakovali za osnovni kvadratni matrični objekt:
razred Matrix
{
javno:
Matrika (int inSize);
virtualni ~Matrix();
int getSize( void);
int getDeterminant( void);
void setElement( int inRow, int inCol, int inValue);
int getElement( int inRow, int inCol );
Matrični operator+( const Matrix& inAddend );
zasebno:
int m_size;
int[][] m_elementi;
};
Za uporabo Objective-C++ morajo vaši moduli razreda Objective-C++ uporabljati pripono datoteke .mm. To pove prevajalniku Xcode, da je treba razred prevesti z uporabo Objective-C++, kar bo vašemu razredu omogočilo uporabo ključnih besed jezika C++. Z uporabo Objective-C++ lahko vaša aplikacija ustvari objekt Matrix za izvajanje osnovnih operacij, kot je dodajanje dveh objektov Matrix skupaj. To predpostavlja, da je izvorni modul Objective-C++ #uvozil datoteko C++ Matrix.h:
- (ne)addTwoMatrices
{
Matrična matrikaOne(3); // matrika 3x3
Matrična matrikaDve(3); // drugo
int rowIndex = 0;
int colIndex = 0;
za (indeks vrstice=0; indeks vrstice<3; ++indeks vrstice)
{
za (colIndex=0; colIndex<3; ++colIndex)
{
// nastavi matrične elemente na njihove vrednosti
matrixOne.setElement( rowIndex, colIndex, XXX);
// nastavi elemente matrike dva na druge vrednosti
matrixTwo.setElement( rowIndex, colIndex, YYY);
}
}
Matrična matrikaSum = matrixOne + matrixTwo;
Z Objective-C++ lahko vaše aplikacije izkoristijo vse razpoložljive knjižnice drugih proizvajalcev, napisane za C++.