Разработването на приложения за Macintosh изисква креативност, умения за програмиране на Objective-C, известно търпение и хубава помощ за постоянство за внедряване, прецизиране и доставяне на вашето приложение за Macintosh в добро работно състояние на вашите потребители. По пътя си към тази дестинация ще срещнете някои предизвикателства, които ще тестват вашите умения за програмиране и решаване на проблеми. Трябва да се справите с (наред с други неща) използването на делегати за прилагане на обратни извиквания на приложение; използване на не-Objective-C рамки от Apple; и включване на C++ код във вашите приложения.
Внедряване на обратни повиквания в приложения на Macintosh
Разработката на приложения за Macintosh използва обратно извикване, за да позволи на Mac OS X да изпълнява код във вашето приложение за конкретни операции. Ако създавате стандартно приложение, базирано на прозорци или документи за Macintosh, първият код, който OS X ще изпълни, е в един от следните методи за обратно извикване, които трябва да създадете за приложението си, в зависимост от дизайна на приложението:
-
Приложения, базирани на прозорец: (void)applicationDidFinishLaunching:(NSNotification*)aNotification
-
Приложения, базирани на документи: (void)windowControllerDidLoadNib:(NSWindowController*)windowController
Обратното извикване е просто метод, който операционната система в крайна сметка изпълнява, докато се опитва да предостави или извлече информация от вашето приложение. Кодът на вашето приложение ще изпълни метод за клас Cocoa, където вашето приложение ще има възможност да предостави името на метод на един от вашите класове, който да бъде извикан върху обект от този клас, който приложението ви също трябва да предостави.
А делегат е помощник обект, който клас Какао използва, за да се разшири функционалността на класа, като ви позволява да изпълнява код, който класа какаото ще изпълни при определени обстоятелства. Клас Cocoa проверява своя обект на делегат (ако е присвоен) за това дали делегатът предоставя реализация на конкретен метод. Ако делегатът има този метод, класът Cocoa изпълнява този метод; ако делегатът не прилага този конкретен метод, класът Cocoa или използва собствен метод по подразбиране, или регистрира грешка. Повечето делегати трябва да включат конкретен протокол, който определя какви методи могат да прилагат; делегатите на вашия код трябва да използват методите за внедряване от конкретния протокол, който делегатът очаква.
Ето някои от обектите Cocoa, които могат да използват делегати за изпълнение на вашия код:
-
NSTableView. NSTableView приема делегат, който се подчинява на протокола NSTableViewDelegate. Това включва 20 до 30 метода, които обектът на делегата на вашето приложение може да приложи, за да поддържа необходимостта на приложението ви да знае какво прави NSTableView. Има методи, които ще бъдат извикани във вашето приложение, когато то трябва да знае и да реагира на действие, като например когато потребител направи избор в таблицата или когато колона бъде преоразмерена.
-
NSA приложение. Можете да зададете NSApplicationDelegate да обработва някои от методите, които екземпляр на NSApplication (вашето приложение) ще получи. Тези методи могат да бъдат извикани точно преди или веднага след като приложението ви изпълни друг метод, така че приложението ви да може да бъде подготвено.
-
NSWindow. NSWindowDelegate, присвоен на един от прозорците на вашето приложение, ще даде на приложението ви шанс да отговори на потребителско преоразмеряване, преместване или други събития на прозореца.
-
NSMenu. Внедрявате NSMenuDelegate, за да поддържате събития, които се случват, когато потребител взаимодейства с менютата във вашето приложение.
Non-Objective-C Frameworks в приложения за Macintosh
Apple предоставя много рамки за разработка на приложения за Macintosh (кодови библиотеки), които вашето приложение може да извика, за да изпълни хилядите операции в OS X. Много от тези рамки, като PDF Kit, са съставени от Objective-C класове, от които вашето приложение може създавайте и използвайте обекти във вашите приложения. Някои от тези рамки обаче са просто библиотеки с функции, които вашето приложение може да изпълнява.
Например рамката CFNetwork е набор от функции, които вашето приложение може да използва за извършване на фино настроени мрежови връзки. Класът NSURL предоставя добър набор от основни мрежови операции, които са чудесни за извличане на данни с помощта на URL. Ако приложението ви изисква повече контрол върху мрежовите комуникации, които инициира, ще трябва да използвате рамката CFNetwork и нейните функции. Можете да използвате следния код, за да подготвите HTTP заявка за предаване до конкретен URL:
CFStringRef httpBody = CFSTR( ");
CFStringRef headerFieldName = CFSTR( "Cookie"); // добавяне на конкретна бисквитка към 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(заявка, httpBody);
// добавяне на бисквитката
CFHTTPMessageSetHeaderFieldValue(заявка, headerFieldName, headerFieldValue);
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage(заявка);
След като кодът ви има сериализирана заявка, приложението ви може да отвори поток за запис, за да достави заявката до местоназначението му.
Всички базирани на C рамки на Apple предоставят набор от функции за извършване на този тип програмиране от по-ниско ниво. Вашият код ще стане по-сложен, но Apple не предоставя Objective-C класове за всичките си рамки. Ако наистина се нуждаете от функционалността, налична в една от тези рамки, това е единственият начин да постигнете целите на приложението си. Следните рамки не предоставят Objective-C класове:
Ако искате да създавате приложения, които могат да се възползват изцяло от функциите на OS X, трябва да сте готови да поддържате използването на библиотеки с кодове, които не са Objective-C.
C++ код в Objective-C Macintosh приложения
Objective-C предоставя обектно-ориентирани функции за разработка на приложения на Macintosh, като например наследяване и полиморфизъм. Езикът е базиран на езика за програмиране C; следователно можете да използвате знанията си по програмиране на C, за да кодирате в Objective-C. Objective-C++ е мостов механизъм, който позволява на изходните модули на Objective-C да работят с Objective-C++ класове, които могат да компилират и свързват с библиотеки с код на C++.
Следният прост пример за квадратна матрица показва съдържанието на C++ заглавен файл за клас Matrix. Класът Matrix идва със стандартния конструктор и деструктор за C++ клас, а методите са това, което бихте очаквали за основен квадратен матричен обект:
клас Матрица
{
обществено:
Матрица ( int inSize );
виртуален ~Matrix();
int getSize( void);
int getDeterminant( void);
void setElement( int inRow, int inCol, int inValue);
int getElement( int inRow, int inCol );
Матричен оператор+( const Matrix& inAddend );
частен:
int m_size;
int[][] m_elements;
};
За да използвате Objective-C++, вашите модули на клас Objective-C++ трябва да използват разширението на файла .mm. Това казва на компилатора на Xcode, че класът трябва да бъде компилиран с помощта на Objective-C++, което ще позволи на вашия клас да използва ключови думи на езика C++. Използвайки Objective-C++, вашето приложение може да създаде обект Matrix за извършване на основни операции, като например добавяне на два обекта Matrix заедно. Това предполага, че изходният модул Objective-C++ е #импортирал файла C++ Matrix.h:
- (невалидна) addTwoMatrices
{
Матрица matrixOne( 3 ); // 3x3 матрица
Матрица matrixTwo( 3 ); // друг
int rowIndex = 0;
int colIndex = 0;
за (rowIndex=0; rowIndex<3; ++rowIndex)
{
за (colIndex=0; colIndex<3; ++colIndex)
{
// задаване на нечии елементи от матрицата на техните стойности
matrixOne.setElement( rowIndex, colIndex, XXX );
// задаване на елементите на матрица две на някои други стойности
matrixTwo.setElement( rowIndex, colIndex, YYY );
}
}
Матрица matrixSum = matrixOne + matrixTwo;
С Objective-C++ вашите приложения могат да се възползват от всички налични библиотеки на трети страни, написани за C++.