Zhvillimi i aplikacionit Macintosh kërkon kreativitet, aftësi programimi Objective-C, pak durim dhe një ndihmë të këndshme këmbënguljeje për të zbatuar, rafinuar dhe shpërndarë aplikacionin tuaj Macintosh në gjendje të mirë pune te përdoruesit tuaj. Në rrugën tuaj për në këtë destinacion, do të hasni disa sfida që do të testojnë aftësitë tuaja programuese dhe zgjidhjen e problemeve. Ju duhet të kuptoni (ndër të tjera) përdorimin e delegatëve për të zbatuar kthimin e thirrjeve të aplikacionit; duke përdorur korniza jo-Objective-C nga Apple; dhe duke inkorporuar kodin C++ në aplikacionet tuaja.
Zbatimi i kthimeve të thirrjeve në aplikacionet Macintosh
Zhvillimi i aplikacionit Macintosh përdor kthimin e thirrjeve për të lejuar Mac OS X të ekzekutojë kodin brenda aplikacionit tuaj për operacione specifike. Nëse po krijoni një aplikacion standard të bazuar në dritare ose dokument Macintosh, kodi i parë që do të ekzekutojë OS X është në një nga metodat e mëposhtme të kthimit të thirrjes që duhet të krijoni për aplikacionin tuaj, në varësi të dizajnit të aplikacionit:
-
Aplikacionet e bazuara në dritare: (void)applicationDidFinishLaunching:(NSNotification*)aNjoftim
-
Aplikacionet e bazuara në dokumente: (void)windowControllerDidLoadNib:(NSWindowController*)windowController
Një telefonatë është thjesht një metodë që OS përfundimisht e ekzekuton ndërsa po përpiqet të ofrojë ose të marrë informacion nga aplikacioni juaj. Kodi juaj i aplikacionit do të ekzekutojë një metodë për një klasë Kakao, ku aplikacioni juaj do të ketë mundësinë të japë emrin e një metode të njërës prej klasave tuaja, për t'u thirrur në një objekt të asaj klase që aplikacioni juaj gjithashtu do të duhet të ofrojë.
Një delegat është një objekt ndihmës, të cilin një klasë Cocoa e përdor për të zgjeruar funksionalitetin e klasës duke ju lejuar të zbatoni kodin që klasa Cocoa do të ekzekutojë në rrethana të caktuara. Një klasë Kakao kontrollon objektin e saj të deleguar (nëse një i është caktuar) nëse delegati ofron një zbatim të një metode specifike. Nëse delegati e ka atë metodë, klasa Kakao e ekzekuton atë metodë; nëse delegati nuk e zbaton atë metodë specifike, klasa Kakao ose përdor një metodë të paracaktuar të saj ose regjistron një gabim. Shumica e delegatëve duhet të përfshijnë një protokoll të veçantë që përcakton se cilat metoda mund të zbatojnë; delegatët e kodit tuaj duhet të përdorin metodat e implementimit nga protokolli specifik që pret delegati.
Këtu janë disa nga objektet e Kakaos që mund të përdorin delegatë për të ekzekutuar kodin tuaj:
-
NSTableView. NSTableView pranon një delegat që i bindet protokollit NSTableViewDelegate. Kjo përfshin 20 deri në 30 metoda që objekti i deleguar i aplikacionit tuaj mund të zbatojë për të mbështetur nevojën e aplikacionit tuaj për të ditur se çfarë po bën NSTableView. Ka metoda që do të thirren në aplikacionin tuaj kur duhet të dijë dhe të reagojë ndaj një veprimi, si p.sh. kur një përdorues bën një përzgjedhje në tabelë ose kur madhësia e një kolone ndryshohet.
-
Aplikimi NSA. Ju mund të caktoni një NSApplicationDelegate për të trajtuar disa nga metodat që do të marrë një shembull NSApplication (aplikacioni juaj). Këto metoda mund të thirren pak përpara ose menjëherë pasi aplikacioni juaj të ekzekutojë një metodë tjetër, në mënyrë që aplikacioni juaj të mund të përgatitet.
-
NSWindow. Një NSWindowDelegate i caktuar në një nga dritaret e aplikacionit tuaj do t'i japë aplikacionit tuaj një shans për t'iu përgjigjur ndryshimit të madhësisë, lëvizjes së përdoruesit ose ngjarjeve të tjera të dritares.
-
NSmenu. Ju zbatoni një NSmenuDelegate për të mbështetur ngjarjet që ndodhin kur një përdorues ndërvepron me menutë në aplikacionin tuaj.
Kornizat Jo-Objective-C në aplikacionet Macintosh
Apple ofron shumë korniza të zhvillimit të aplikacioneve Macintosh (biblioteka kodesh) që aplikacioni juaj mund t'i thërrasë për të kryer mijëra operacione në OS X. Shumë prej këtyre kornizave, siç është Kompleti PDF, përbëhen nga klasa Objektivi-C, nga të cilat aplikacioni juaj mund të krijoni dhe përdorni objekte brenda aplikacioneve tuaja. Megjithatë, disa nga këto korniza janë thjesht biblioteka funksionesh që aplikacioni juaj mund të ekzekutojë.
Për shembull, korniza CFNetwork është një grup funksionesh që aplikacioni juaj mund të përdorë për të kryer lidhje të rregulluara të rrjetit. Klasa NSURL ofron një grup të mirë të operacioneve bazë të rrjetit që janë të shkëlqyera për marrjen e të dhënave duke përdorur një URL. Nëse aplikacioni juaj kërkon më shumë kontroll mbi komunikimet e rrjetit që ai nis, do t'ju duhet të përdorni kornizën CFNetwork dhe funksionet e tij. Ju mund të përdorni kodin e mëposhtëm për të përgatitur një kërkesë HTTP për transmetim në një URL specifike:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR( "Cookie" ); // shtoni një skedar specifik në kërkesën HTTP
CFStringRef headerFieldValue = CFSTR( "loginID=emri_i_përdoruesit; fjalëkalimi=fjalëkalimi_my;" );
CFStringRef url = CFSTR( "www.diabeticpad.com" );
CFURLRef urlRef = CFURLCreateWithStrign( kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR( "GET" );
Kërkesa CFHTTPMessageRef = CFHTTPMmessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody(kërkesë, httpBody );
// shtoni cookie-n
CFHTTPMessageSetHeaderFieldValue(kërkesa, headerFieldName, headerFieldValue );
CFDataRef serializedHttpRequest = CFHTTPMmessageCopySerializedMessage(kërkesë);
Pasi kodi juaj të ketë kërkesën e serializuar, aplikacioni juaj më pas mund të hapë një transmetim shkrimi në mënyrë që ta dorëzojë kërkesën në destinacionin e tij.
Të gjitha kornizat e Apple me bazë C-në ofrojnë një sërë funksionesh për kryerjen e këtij lloji të programimit të nivelit më të ulët. Kodi juaj do të bëhet më i ndërlikuar, por Apple nuk ofron klasa Objective-C për të gjitha kornizat e saj. Nëse vërtet keni nevojë për funksionalitetin e disponueshëm në një nga ato korniza, kjo është mënyra e vetme për të arritur qëllimet e aplikacionit tuaj. Kornizat e mëposhtme nuk ofrojnë klasa Objective-C:
Nëse dëshironi të krijoni aplikacione që mund të përfitojnë plotësisht nga veçoritë e OS X, duhet të jeni gati për të mbështetur përdorimin e bibliotekave të kodeve jo-Objective-C.
Kodi C++ në aplikacionet Macintosh Objective-C
Objective-C ofron veçori të orientuara nga objekti për zhvillimin e aplikacioneve Macintosh, të tilla si trashëgimia dhe polimorfizmi. Gjuha bazohet në gjuhën e programimit C; prandaj, ju mund të përdorni njohuritë tuaja të programimit C për të koduar brenda Objective-C. Objective-C++ është një mekanizëm urë që lejon modulet burimore të Objective-C të punojnë me klasat Objective-C++, të cilat mund të përpilohen dhe lidhen me bibliotekat e kodeve C++.
Shembulli i mëposhtëm i thjeshtë i një matrice katrore tregon përmbajtjen e një skedari të kokës C++ për një klasë Matrix. Klasa Matrix vjen me konstruktorin dhe destruktorin standard për një klasë C++, dhe metodat janë ato që prisni për një objekt bazë të matricës katrore:
Matrica e klasës
{
publike:
Matrica (int inSize);
virtuale ~Matrix();
int getSize(void);
int getDeterminant( void );
void setElement( int inRow, int inCol, int inValue );
int getElement( int inRow, int inCol );
Operatori i matricës+(const Matrica& inAddend);
private:
int m_madhësia;
int[][] m_elemente;
};
Për të përdorur Objective-C++, modulet tuaja të klasës Objective-C++ duhet të përdorin shtesën e skedarit .mm. Kjo i tregon përpiluesit të Xcode se klasa duhet të kompilohet duke përdorur Objective-C++, gjë që do t'i lejojë klasës tuaj të përdorë fjalë kyçe të gjuhës C++. Duke përdorur Objective-C++, aplikacioni juaj mund të krijojë një objekt Matrix për të kryer operacione bazë, të tilla si shtimi i dy objekteve të Matricës së bashku. Kjo supozon se moduli burimor Objective-C++ ka #importuar skedarin C++ Matrix.h:
- (i pavlefshëm) shtoj dy matrica
{
Matrica e matricësOne( 3 ); // matricë 3x3
Matrica e matricësDy( 3 ); // një tjetër
int rowIndex = 0;
int colIndex = 0;
për (rowIndex=0; rowIndex<3; ++rowIndex)
{
për (colIndex=0; colIndex<3; ++colIndex)
{
// vendos elementet e matricës me vlerat e tyre
matrixOne.setElement(rowIndex, colIndex, XXX);
// vendos elementet e matricës dy në disa vlera të tjera
matrixTwo.setElement(rowIndex, colIndex, YYY);
}
}
Matrica e matricës Shuma = matricaNjë + matricaDy;
Me Objective-C++, aplikacionet tuaja mund të përfitojnë nga të gjitha bibliotekat e disponueshme të palëve të treta të shkruara për C++.