Macintoshi rakenduste arendamiseks on vaja loovust, Objective-C programmeerimisoskusi, kannatlikkust ja kena järjekindlust, et teie Macintoshi rakendust oma kasutajatele heas töökorras juurutada, täiustada ja edastada. Teel sellesse sihtkohta puutute kokku väljakutsetega, mis panevad proovile teie programmeerimis- ja probleemide lahendamise oskused. Peate (muu hulgas) hakkama saama delegaatide kasutamisega rakenduste tagasikutsumiste rakendamiseks; Apple'i mitte-Objective-C raamistike kasutamine; ja lisades oma rakendustesse C++ koodi.
Tagasihelistuste rakendamine Macintoshi rakendustes
Macintoshi rakenduste arendus kasutab tagasihelistusi, et võimaldada Mac OS X-il käivitada teie rakenduses teatud toimingute jaoks koodi. Kui loote standardse Macintoshi akna- või dokumendipõhise rakenduse, siis esimene kood, mille OS X käivitab, on üks järgmistest tagasihelistamismeetoditest, mille peate oma rakenduse jaoks olenevalt rakenduse kujundusest looma.
Tagasihelistamine on lihtsalt meetod, mille OS lõpuks käivitab, kui ta proovib teie rakendusest teavet edastada või sealt hankida. Teie rakenduse kood käivitab meetodi Cocoa klassi jaoks, kus teie rakendusel on võimalus esitada ühe teie klassi meetodi nimi, et seda saaks kutsuda selle klassi objektil, mille teie rakendus peab samuti esitama.
Delegaat on opastusobjektia, mille Cocoa klassi kasutab laiendada funktsionaalsust klassi, võimaldades teil rakendada kood, mida Cocoa klassi täidab teatud tingimustel. Cocoa klass kontrollib oma delegaadiobjekti (kui see on määratud), kas delegaat pakub konkreetse meetodi rakendamist. Kui delegaadil on see meetod, käivitab Cocoa klass selle meetodi; kui delegaat seda konkreetset meetodit ei rakenda, kasutab Cocoa klass kas oma vaikemeetodit või logib vea. Enamik delegaate peab lisama konkreetse protokolli, mis määrab, milliseid meetodeid nad võivad rakendada; teie koodi delegaadid peavad kasutama konkreetse protokolli rakendusmeetodeid, mida delegaat eeldab.
Siin on mõned Cocoa objektid, mis võivad teie koodi käivitamiseks kasutada delegaate:
-
NSTableView. NSTableView võtab vastu delegaadi, kes järgib NSTableViewDelegate protokolli. See hõlmab 20–30 meetodit, mida teie rakenduse delegeeritud objekt saab rakendada, et toetada teie rakenduse vajadust teada, mida NSTableView teeb. On meetodeid, mida teie rakenduses kutsutakse välja siis, kui see peab toimingut teadma ja neile reageerima, näiteks kui kasutaja teeb tabelis valiku või kui veeru suurust muudetakse.
-
NSApplication. Saate määrata NSApplicationDelegate'i, et hallata mõnda meetodit, mille NSApplication eksemplar (teie rakendus) saab. Neid meetodeid võidakse kutsuda vahetult enne või vahetult pärast seda, kui teie rakendus käivitab mõne muu meetodi, et teie rakendust saaks ette valmistada.
-
NSWindow. Ühele teie rakenduse aknale määratud NSWindowDelegate annab teie rakendusele võimaluse reageerida kasutaja suuruse muutmisele, teisaldamisele või muudele aknasündmustele.
-
NSMenu. Rakendate NSMenuDelegate'i, et toetada sündmusi, mis juhtuvad, kui kasutaja suhtleb teie rakenduse menüüdega.
Mitteobjektiiv-C raamistikud Macintoshi rakendustes
Apple pakub palju Macintoshi rakenduste arendusraamistikke (kooditeeke), mida teie rakendus saab kutsuda tuhandete operatsioonide tegemiseks operatsioonisüsteemis OS X. Paljud neist raamistikest, näiteks PDF-komplekt, koosnevad Objective-C klassidest, millest teie rakendus saab luua ja kasutada oma rakendustes objekte. Mõned neist raamistikest on aga vaid funktsioonide teegid, mida teie rakendus saab täita.
Näiteks CFNetworki raamistik on funktsioonide komplekt, mida teie rakendus saab kasutada võrguühenduste peenhäälestamiseks. NSURL-i klass pakub head komplekti põhilisi võrgutoiminguid, mis sobivad suurepäraselt andmete toomiseks URL-i abil. Kui teie rakendus nõuab suuremat kontrolli selle algatatud võrgusuhtluse üle, peate kasutama CFNetworki raamistikku ja selle funktsioone. HTTP-päringu ettevalmistamiseks konkreetsele URL-ile edastamiseks võite kasutada järgmist koodi:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR("küpsis"); // lisage HTTP päringule konkreetne küpsis
CFStringRef headerFieldValue = CFSTR( "loginID=minu_kasutaja_nimi; parool=minu_parool;" );
CFStringRef url = CFSTR("www.diabeticpad.com");
CFURLRef urlRef = CFURLCreateWithStrign( kCFAllocatorDefault, url, NULL );
CFStringRef requestMethod = CFSTR( "GET" );
CFHTTPMessageRef taotlus = CFHTTPMessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody(päring, httpBody );
// lisage küpsis
CFHTTPMessageSetHeaderFieldValue(päring, päiseväljanimi, päiseväljaVäärtus );
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage( request );
Kui teie koodil on järjestatud taotlus, saab teie rakendus avada kirjutusvoo, et päring sihtkohta toimetada.
Kõik C-põhised Apple'i raamistikud pakuvad seda tüüpi madalama taseme programmeerimise teostamiseks funktsioonide komplekti. Teie kood muutub keerulisemaks, kuid Apple ei paku kõigi oma raamistike jaoks Objective-C klasse. Kui vajate tõesti ühes neist raamistikest saadaolevaid funktsioone, on see ainus viis oma rakenduse eesmärkide saavutamiseks. Järgmised raamistikud ei paku Objective-C klasse:
Kui soovite luua rakendusi, mis saavad OS X-i funktsioone täielikult ära kasutada, peate olema valmis toetama mitte-Objective-C kooditeeke.
C++ kood Objective-C Macintoshi rakendustes
Objective-C pakub Macintoshi rakenduste arendamiseks objektorienteeritud funktsioone, nagu pärimine ja polümorfism. Keel põhineb C programmeerimiskeelel; Seetõttu saate Objective-C kodeerimiseks kasutada oma C-programmeerimise teadmisi. Objective-C++ on sildmehhanism, mis võimaldab Objective-C lähtemoodulitel töötada Objective-C++ klassidega, mis võivad kompileerida ja linkida C++ kooditeekidega.
Järgmine lihtne ruutmaatriksi näide näitab maatriksi klassi C++ päisefaili sisu. Klass Matrix on varustatud C++ klassi jaoks mõeldud standardse konstruktori ja destruktoriga ning meetodid on sellised, mida eeldate põhilise ruutmaatriksobjekti puhul:
klassi Matrix
{
avalik:
Matrix( int inSize );
virtuaalne ~Matrix();
int getSize( void );
int getDeterminant( void );
void setElement( int inRow, int inCol, int inValue );
int getElement( int inRow, int inCol );
Maatriksi operaator+( const Maatriks& inAddend );
privaatne:
int m_size;
int[][] m_elemendid;
};
Objective-C++ kasutamiseks peavad teie Objective-C++ klassi moodulid kasutama faililaiendit .mm. See annab Xcode'i kompilaatorile teada, et klass tuleb kompileerida kasutades Objective-C++, mis võimaldab teie klassil kasutada C++ keele märksõnu. Kasutades Objective-C++, võib teie rakendus luua põhitoimingute tegemiseks maatriksiobjekti, näiteks kahe maatriksiobjekti liitmiseks. See eeldab, et Objective-C++ lähtemoodul on #importinud faili C++ Matrix.h:
- (kehtetu) lisage kaks maatriksit
{
Matrix matrixOne( 3 ); // 3x3 maatriks
maatriksmaatriksTwo( 3 ); // teine
int rowIndeks = 0;
int colIndeks = 0;
jaoks (rowIndex=0; rowIndex<3; ++rowIndex)
{
jaoks (colIndex=0; colIndex<3; ++colIndex)
{
// seab maatriksi elemendid nende väärtustele
matrixOne.setElement( rowIndex, colIndex, XXX );
// määrake maatriksi kahe elemendid mõnele muule väärtusele
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
MaatriksmaatriksSum = maatriksOne + maatriksKaks;
Objective-C++ abil saavad teie rakendused ära kasutada kõiki saadaolevaid C++ jaoks kirjutatud kolmandate osapoolte teeke.