El desenvolupament d'aplicacions Macintosh requereix creativitat, habilitats de programació Objective-C, una mica de paciència i una bona ajuda de persistència per implementar, perfeccionar i lliurar la vostra aplicació Macintosh en bon estat de funcionament als vostres usuaris. En el camí cap a aquesta destinació, trobareu alguns reptes que posaran a prova les vostres habilitats de programació i resolució de problemes. Heu de comprendre (entre altres coses) l'ús de delegats per implementar les devolució de trucades d'aplicacions; utilitzant marcs que no siguin Objective-C d'Apple; i incorporant codi C++ a les vostres aplicacions.
Implementació de devolució de trucada en aplicacions de Macintosh
El desenvolupament d'aplicacions de Macintosh utilitza devolucions de trucada per permetre que Mac OS X executi codi dins de la vostra aplicació per a operacions específiques. Si esteu creant una aplicació estàndard de finestres o documents de Macintosh, el primer codi que executarà OS X és en un dels mètodes de devolució de trucada següents que heu de crear per a la vostra aplicació, depenent del disseny de l'aplicació:
-
Aplicacions basades en finestres: (void)applicationDidFinishLaunching:(NSNotification*)aNotification
-
Aplicacions basades en documents: (void)windowControllerDidLoadNib:(NSWindowController*)windowController
Una devolució de trucada és simplement un mètode que el sistema operatiu eventualment executa mentre intenta proporcionar o recuperar informació de la vostra aplicació. El vostre codi d'aplicació executarà un mètode per a una classe Cocoa on la vostra aplicació tindrà l'oportunitat de proporcionar el nom d'un mètode d'una de les vostres classes, per ser cridat a un objecte d'aquesta classe la vostra aplicació també haurà de proporcionar.
Un delegat és un objecte d'ajuda, que una classe Cocoa utilitza per ampliar la funcionalitat de la classe, permetent-vos implementar el codi que la classe Cocoa executarà en determinades circumstàncies. Una classe Cocoa comprova el seu objecte delegat (si se n'ha assignat un) per saber si el delegat proporciona una implementació d'un mètode específic. Si el delegat té aquest mètode, la classe Cocoa executa aquest mètode; si el delegat no implementa aquest mètode específic, la classe Cocoa utilitza un mètode predeterminat propi o registra un error. La majoria de delegats han d'incorporar un protocol concret que determini quins mètodes poden implementar; els delegats del vostre codi han d'utilitzar els mètodes d'implementació del protocol específic que el delegat espera.
Aquests són alguns dels objectes Cocoa que poden utilitzar delegats per executar el vostre codi:
-
NSTableView. El NSTableView accepta un delegat que obeeix el protocol NSTableViewDelegate. Això inclou entre 20 i 30 mètodes que l'objecte delegat de la vostra aplicació pot implementar per donar suport a la necessitat de la vostra aplicació de saber què està fent NSTableView. Hi ha mètodes que es cridaran a la vostra aplicació quan necessiti conèixer i reaccionar davant d'una acció, com ara quan un usuari fa una selecció a la taula o quan es redimensiona una columna.
-
Aplicació NS. Podeu assignar un NSApplicationDelegate per gestionar alguns dels mètodes que rebrà una instància NSApplication (la vostra aplicació). Aquests mètodes es poden cridar just abans o just després que la vostra aplicació executi un altre mètode, de manera que la vostra aplicació es pugui preparar.
-
Finestra NSW. Un NSWindowDelegate assignat a una de les finestres de la vostra aplicació li donarà l'oportunitat de respondre a un usuari que canvia la mida, es mou o altres esdeveniments de la finestra.
-
NSMu. Implementeu un NSMenuDelegate per donar suport als esdeveniments que succeeixen quan un usuari interactua amb els menús de la vostra aplicació.
Frameworks no Objectius-C en aplicacions de Macintosh
Apple ofereix molts marcs de desenvolupament d'aplicacions per a Macintosh (biblioteca de codi) als quals la vostra aplicació pot trucar per dur a terme els milers d'operacions a OS X. Molts d'aquests marcs, com ara el kit PDF, es componen de classes Objective-C, a partir de les quals la vostra aplicació pot Creeu i utilitzeu objectes dins de les vostres aplicacions. Tanmateix, alguns d'aquests marcs són només biblioteques de funcions que la vostra aplicació pot executar.
Per exemple, el marc CFNetwork és un conjunt de funcions que la vostra aplicació pot utilitzar per realitzar connexions de xarxa afinades. La classe NSURL proporciona un bon conjunt d'operacions bàsiques de xarxa que són excel·lents per recuperar dades mitjançant un URL. Si la vostra aplicació requereix més control sobre les comunicacions de xarxa que inicia, haureu d'utilitzar el marc CFNetwork i les seves funcions. Podeu utilitzar el codi següent per preparar una sol·licitud HTTP per a la transmissió a un URL específic:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR( "Cookie" ); // afegeix una galeta específica a la sol·licitud HTTP
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 request = CFHTTPMessageCreateRequest (kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody( sol·licitud, httpBody );
// afegeix la galeta
CFHTTPMessageSetHeaderFieldValue( sol·licitud, headerFieldName, headerFieldValue );
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage( sol·licitud);
Un cop el vostre codi tingui la sol·licitud serialitzada, la vostra aplicació pot obrir un flux d'escriptura per enviar la sol·licitud a la seva destinació.
Tots els frameworks d'Apple basats en C proporcionen un conjunt de funcions per dur a terme aquest tipus de programació de nivell inferior. El vostre codi es complicarà, però Apple no ofereix classes Objective-C per a tots els seus marcs. Si realment necessiteu la funcionalitat disponible en un d'aquests marcs, aquesta és l'única manera d'assolir els objectius de la vostra aplicació. Els marcs següents no proporcionen classes Objective-C:
Si voleu crear aplicacions que puguin aprofitar al màxim les característiques d'OS X, heu d'estar preparats per admetre l'ús de biblioteques de codi que no siguin Objective-C.
Codi C++ a les aplicacions Objective-C Macintosh
Objective-C proporciona funcions orientades a objectes per al desenvolupament d'aplicacions Macintosh, com ara l'herència i el polimorfisme. El llenguatge es basa en el llenguatge de programació C; per tant, podeu utilitzar els vostres coneixements de programació en C per codificar dins de Objective-C. Objective-C++ és un mecanisme de pont que permet als mòduls font Objective-C treballar amb classes Objective-C++, que podrien compilar i enllaçar amb biblioteques de codi C++.
El següent exemple senzill d'una matriu quadrada mostra el contingut d'un fitxer de capçalera C++ per a una classe Matrix. La classe Matrix ve amb el constructor i el destructor estàndard per a una classe C++, i els mètodes són els que espereu per a un objecte de matriu quadrada bàsica:
matriu de classe
{
públic:
Matrix( int inSize );
virtual ~Matrix();
int getSize(vod);
int getDeterminant(vod);
void setElement( int inRow, int inCol, int inValue);
int getElement( int inRow, int inCol );
Operador de matriu+( const Matrix& inAddend );
privat:
int m_size;
int[][] m_elements;
};
Per utilitzar Objective-C++, els vostres mòduls de classe Objective-C++ han d'utilitzar l'extensió de fitxer .mm. Això indica al compilador de Xcode que la classe s'ha de compilar amb Objective-C++, que permetrà que la vostra classe utilitzi paraules clau del llenguatge C++. Amb Objective-C++, la vostra aplicació podria crear un objecte Matrix per realitzar operacions bàsiques, com ara afegir dos objectes Matrix junts. Això suposa que el mòdul font Objective-C++ ha #importat el fitxer C++ Matrix.h:
- (void) addTwoMatrices
{
Matrix matrixOne(3); // Matriu 3x3
Matrix matrixTwo(3); // un altre
int rowIndex = 0;
int colIndex = 0;
per a (rowIndex=0; rowIndex<3; ++rowIndex)
{
per a (colIndex=0; colIndex<3; ++colIndex)
{
// establir els elements de la matriu als seus valors
matrixOne.setElement( rowIndex, colIndex, XXX );
// estableix els elements de la matriu dos amb altres valors
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
Matrix matrixSum = matrixOne + matrixTwo;
Amb Objective-C++, les vostres aplicacions poden aprofitar totes les biblioteques de tercers disponibles escrites per a C++.