„Macintosh“ taikomųjų programų kūrimas reikalauja kūrybiškumo, „Objective-C“ programavimo įgūdžių, šiek tiek kantrybės ir malonaus atkaklumo, kad įdiegtumėte, patobulintumėte ir pateiktumėte savo „Macintosh“ programą gerai veikiančią savo vartotojams. Pakeliui į šią vietą susidursite su tam tikrais iššūkiais, kurie patikrins jūsų programavimo ir problemų sprendimo įgūdžius. Turite susitvarkyti su (be kita ko) delegatų naudojimu, kad įgyvendintumėte programų atgalinius iškvietimus; naudojant Apple ne Objective-C sistemas; ir įtraukti C++ kodą į savo programas.
Atgalinių skambučių įgyvendinimas „Macintosh“ programose
Kuriant „Macintosh“ programas naudojami atgaliniai skambučiai , kad „Mac OS X“ galėtų vykdyti kodą jūsų programoje tam tikroms operacijoms atlikti. Jei kuriate standartinę „Macintosh“ langu arba dokumentu pagrįstą programą, pirmasis kodas, kurį OS X vykdys, yra vienas iš toliau nurodytų atgalinio iškvietimo metodų, kuriuos turite sukurti savo programai, atsižvelgiant į programos dizainą:
Atgalinis skambinimas yra tiesiog metodas, kurį OS galiausiai vykdo, kai bando pateikti arba nuskaityti informaciją iš jūsų programos. Jūsų programos kodas vykdys „Cocoa“ klasės metodą, kuriame jūsų programa turės galimybę pateikti vienos iš jūsų klasių metodo pavadinimą, kad būtų iškviesta tos klasės objektu, kurį taip pat turės pateikti jūsų programa.
Delegatas yra pagalbininkas objektas, kuriame kakavos klasė naudoja pratęsti klasės funkcionalumą leidžia jums įgyvendinti kodas, kuris kakavos klasė atliks tam tikromis aplinkybėmis. „Cocoa“ klasė tikrina savo deleguotojo objektą (jei jis buvo priskirtas), ar delegatas įgyvendina konkretų metodą. Jei delegatas turi tą metodą, Cocoa klasė vykdo tą metodą; jei įgaliotasis neįgyvendina to konkretaus metodo, Cocoa klasė naudoja numatytąjį savo metodą arba registruoja klaidą. Dauguma delegatų turi įtraukti tam tikrą protokolą, kuris nustato, kokius metodus jie gali įgyvendinti; jūsų kodo įgaliotiniai turi naudoti diegimo metodus iš konkretaus protokolo, kurio deleguotasis tikisi.
Štai keletas „Cocoa“ objektų, kurie gali naudoti delegatus jūsų kodui vykdyti:
-
NSTableView. NSTableView priima delegatą, kuris paklūsta NSTableViewDelegate protokolui. Tai apima 20–30 metodų, kuriuos programos įgaliotasis objektas gali įdiegti, kad palaikytų jūsų programos poreikį žinoti, ką veikia NSTableView. Yra metodai, kurie bus iškviesti jūsų programoje, kai jai reikia žinoti ir reaguoti į veiksmą, pvz., kai vartotojas pasirenka lentelėje arba kai keičiamas stulpelio dydis.
-
NSApplication. Galite priskirti NSApplicationDelegate tvarkyti kai kuriuos metodus, kuriuos gaus NSApplication egzempliorius (jūsų programa). Šie metodai gali būti iškviesti prieš pat arba iškart po to, kai programa vykdo kitą metodą, kad būtų galima paruošti programą.
-
NSWindow. Vienam iš jūsų programos langų priskirtas NSWindowDelegate suteiks jūsų programai galimybę reaguoti į vartotojo dydžio keitimą, perkėlimą ar kitus lango įvykius.
-
NSMeniu. Įdiekite NSMenuDelegate, kad palaikytų įvykius, kurie įvyksta, kai vartotojas sąveikauja su jūsų programos meniu.
Ne Objective-C Frameworks Macintosh programose
„Apple“ teikia daug „Macintosh“ programų kūrimo schemų (kodų bibliotekų), kurias jūsų programa gali iškviesti, kad atliktų tūkstančius operacijų OS X. Daugelį šių sistemų, pvz., PDF rinkinį, sudaro „Objective-C“ klasės, iš kurių jūsų programa gali kurkite ir naudokite objektus savo programose. Tačiau kai kurios iš šių sistemų yra tik funkcijų, kurias gali vykdyti jūsų programa, bibliotekos.
Pavyzdžiui, CFNetwork sistema yra funkcijų rinkinys, kurį jūsų programa gali naudoti, kad būtų galima tiksliai suderinti tinklo ryšius. NSURL klasė suteikia gerą pagrindinių tinklo operacijų rinkinį, kuris puikiai tinka duomenims gauti naudojant URL. Jei programai reikia labiau valdyti jos inicijuojamus tinklo ryšius, turėsite naudoti CFNetwork sistemą ir jos funkcijas. Galite naudoti šį kodą, kad paruoštumėte HTTP užklausą perduoti tam tikru URL:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR("slapukas"); // pridėti konkretų slapuką prie HTTP užklausos
CFStringRef headerFieldValue = CFSTR( "loginID=mano_vartotojo_vardas; slaptažodis=mano_slaptažodis;" );
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(užklausa, httpBody );
// pridėkite slapuką
CFHTTPMessageSetHeaderFieldValue(užklausa, antraštėslauko pavadinimas, antraštėslauko vertė );
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage( request );
Kai jūsų kodas gaus nuoseklią užklausą, programa gali atidaryti rašymo srautą, kad užklausa būtų pristatyta į paskirties vietą.
Visose C pagrindu sukurtose Apple sistemose yra funkcijų rinkinys, skirtas tokio tipo žemesnio lygio programavimui atlikti. Jūsų kodas taps sudėtingesnis, tačiau „Apple“ neteikia „Objective-C“ klasių visoms savo sistemoms. Jei jums tikrai reikia funkcionalumo vienoje iš tų sistemų, tai vienintelis būdas pasiekti programos tikslus. Šios sistemos nepateikia Objective-C klasių:
Jei norite sukurti programas, kurios gali išnaudoti visas OS X ypatybes, turite būti pasirengę palaikyti ne Objective-C kodų bibliotekų naudojimą.
C++ kodas Objective-C Macintosh programose
„Objective-C“ teikia į objektą orientuotas funkcijas, skirtas „Macintosh“ programų kūrimui, pvz., paveldėjimą ir polimorfizmą. Kalba yra pagrįsta C programavimo kalba; todėl galite naudoti savo C programavimo žinias koduodami Objective-C. Objective-C++ yra tilto mechanizmas, leidžiantis Objective-C šaltinio moduliams dirbti su Objective-C++ klasėmis, kurios gali kompiliuoti ir susieti su C++ kodų bibliotekomis.
Šis paprastas kvadratinės matricos pavyzdys rodo C++ antraštės failo, skirto Matrix klasei, turinį. Matricos klasėje yra standartinis C++ klasės konstruktorius ir destruktorius, o metodai yra tokie, kokių tikitės iš pagrindinio kvadratinės matricos objekto:
klasės Matrica
{
viešas:
Matrica( int inSize );
virtuali ~Matrica();
int getSize( void );
int getDeterminant( void );
void setElement( int inRow, int inCol, int inValue );
int getElement( int inRow, int inCol );
Matricos operatorius+( const Matrica& inAddend );
privatus:
int m_dydis;
int[][] m_elementai;
};
Norint naudoti Objective-C++, jūsų Objective-C++ klasės moduliai turi naudoti failo plėtinį .mm. Tai nurodo „Xcode“ kompiliatoriui, kad klasė turi būti sudaryta naudojant „Objective-C++“, o tai leis jūsų klasei naudoti C++ kalbos raktinius žodžius. Naudodama „Objective-C++“ programa gali sukurti „Matrix“ objektą, kad atliktų pagrindines operacijas, pvz., pridėtų du „Matrix“ objektus. Daroma prielaida, kad Objective-C++ šaltinio modulis #importavo C++ Matrix.h failą:
- (negalioja) pridėti dvi matricas
{
Matrica matrixOne(3); // 3x3 matrica
Matricos matricaTwo( 3 ); // kitas
int rowIndex = 0;
int colIndeksas = 0;
skirta (rowIndex=0; rowIndex<3; ++rowIndex)
{
skirta (colIndex=0; colIndex<3; ++colIndex)
{
// nustatyti matricos elementus į jų reikšmes
matrixOne.setElement( rowIndex, colIndex, XXX );
// nustatyti matricos du elementus į kai kurias kitas reikšmes
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
Matricos matricos suma = matricaOne + matricaTwo;
Naudodami „Objective-C++“, jūsų programos gali pasinaudoti visomis turimomis trečiųjų šalių bibliotekomis, sukurtomis C++.