Η ανάπτυξη εφαρμογών 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 εκτελεί αυτήν τη μέθοδο. Εάν ο πληρεξούσιος δεν εφαρμόσει τη συγκεκριμένη μέθοδο, η κλάση Cocoa είτε χρησιμοποιεί μια δική της προεπιλεγμένη μέθοδο είτε καταγράφει ένα σφάλμα. Οι περισσότεροι εκπρόσωποι πρέπει να ενσωματώσουν ένα συγκεκριμένο πρωτόκολλο που καθορίζει ποιες μεθόδους μπορούν να εφαρμόσουν. οι εκπρόσωποι του κώδικά σας πρέπει να χρησιμοποιούν τις μεθόδους υλοποίησης από το συγκεκριμένο πρωτόκολλο που αναμένει ο πληρεξούσιος.
Ακολουθούν μερικά από τα αντικείμενα Cocoa που μπορούν να χρησιμοποιήσουν πληρεξούσιους για την εκτέλεση του κώδικά σας:
-
NSTableView. Το NSTableView δέχεται έναν πληρεξούσιο που υπακούει στο πρωτόκολλο NSTableViewDelegate. Αυτό περιλαμβάνει 20 έως 30 μεθόδους που μπορεί να εφαρμόσει το αντικείμενο αντιπροσώπου της εφαρμογής σας για να υποστηρίξει την ανάγκη της εφαρμογής σας να γνωρίζει τι κάνει το NSTableView. Υπάρχουν μέθοδοι που θα καλούνται στην εφαρμογή σας όταν χρειάζεται να γνωρίζει και να αντιδρά σε μια ενέργεια, όπως όταν ένας χρήστης κάνει μια επιλογή στον πίνακα ή όταν αλλάζει το μέγεθος μιας στήλης.
-
Εφαρμογή NSA. Μπορείτε να εκχωρήσετε ένα NSApplicationDelegate για να χειριστεί ορισμένες από τις μεθόδους που θα λάβει μια παρουσία NSApplication (η εφαρμογή σας). Αυτές οι μέθοδοι ενδέχεται να κληθούν ακριβώς πριν ή αμέσως μετά την εκτέλεση μιας άλλης μεθόδου από την εφαρμογή σας, έτσι ώστε η εφαρμογή σας να μπορεί να προετοιμαστεί.
-
NSWindow. Ένα NSWindowDelegate που έχει εκχωρηθεί σε ένα από τα παράθυρα της εφαρμογής σας θα δώσει στην εφαρμογή σας την ευκαιρία να ανταποκριθεί σε αλλαγές μεγέθους, μετακίνησης ή άλλων συμβάντων παραθύρου ενός χρήστη.
-
NSMmenu. Εφαρμόζετε ένα NSmenuDelegate για την υποστήριξη συμβάντων που συμβαίνουν όταν ένας χρήστης αλληλεπιδρά με μενού στην εφαρμογή σας.
Μη αντικειμενικά πλαίσια C σε εφαρμογές Macintosh
Η Apple παρέχει πολλά πλαίσια ανάπτυξης εφαρμογών Macintosh (βιβλιοθήκες κωδικών) που μπορεί να καλέσει η εφαρμογή σας για να εκτελέσει τις χιλιάδες λειτουργίες στο OS X. Πολλά από αυτά τα πλαίσια, όπως το PDF Kit, αποτελούνται από κατηγορίες Objective-C, από τις οποίες η εφαρμογή σας μπορεί να δημιουργήστε και χρησιμοποιήστε αντικείμενα στις εφαρμογές σας. Ωστόσο, ορισμένα από αυτά τα πλαίσια είναι απλώς βιβλιοθήκες λειτουργιών που μπορεί να εκτελέσει η εφαρμογή σας.
Για παράδειγμα, το πλαίσιο CFNetwork είναι ένα σύνολο λειτουργιών που μπορεί να χρησιμοποιήσει η εφαρμογή σας για την εκτέλεση βελτιστοποιημένων συνδέσεων δικτύου. Η κλάση NSURL παρέχει ένα καλό σύνολο βασικών λειτουργιών δικτύου που είναι εξαιρετικές για την ανάκτηση δεδομένων χρησιμοποιώντας μια διεύθυνση URL. Εάν η εφαρμογή σας απαιτεί περισσότερο έλεγχο στις επικοινωνίες δικτύου που εκκινεί, θα πρέπει να χρησιμοποιήσετε το πλαίσιο CFNetwork και τις λειτουργίες του. Θα μπορούσατε να χρησιμοποιήσετε τον ακόλουθο κώδικα για να προετοιμάσετε ένα αίτημα HTTP για μετάδοση σε μια συγκεκριμένη διεύθυνση URL:
CFStringRef httpBody = CFSTR( " );
CFStringRef headerFieldName = CFSTR( "Cookie" ); // προσθήκη συγκεκριμένου 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 αίτημα = CFHTTPMessageCreateRequest( kCFAllocatorDefault, requestMethod, url, kCFHTTPVersion1_1 );
CFHTTPMessageSetBody( αίτημα, httpBody );
// προσθέστε το cookie
CFHTTPMessageSetHeaderFieldValue( αίτημα, headerFieldName, headerFieldValue );
CFDataRef serializedHttpRequest = CFHTTPMessageCopySerializedMessage( αίτημα );
Μόλις ο κωδικός σας έχει το σειριακό αίτημα, η εφαρμογή σας μπορεί στη συνέχεια να ανοίξει μια ροή εγγραφής για να παραδώσει το αίτημα στον προορισμό του.
Όλα τα πλαίσια της Apple που βασίζονται σε C παρέχουν ένα σύνολο λειτουργιών για την εκτέλεση αυτού του τύπου προγραμματισμού χαμηλότερου επιπέδου. Ο κώδικάς σας θα γίνει πιο περίπλοκος, αλλά η Apple δεν παρέχει κλάσεις Objective-C για όλα τα πλαίσια της. Εάν πραγματικά χρειάζεστε τη διαθέσιμη λειτουργικότητα σε ένα από αυτά τα πλαίσια, αυτός είναι ο μόνος τρόπος για να επιτύχετε τους στόχους της εφαρμογής σας. Τα ακόλουθα πλαίσια δεν παρέχουν κλάσεις Objective-C:
Εάν θέλετε να δημιουργήσετε εφαρμογές που μπορούν να εκμεταλλευτούν πλήρως τις δυνατότητες του OS X, πρέπει να είστε έτοιμοι να υποστηρίξετε τη χρήση βιβλιοθηκών κωδικών που δεν ανήκουν στο Objective-C.
Κωδικός C++ σε εφαρμογές Macintosh Objective-C
Το Objective-C παρέχει αντικειμενοστραφή χαρακτηριστικά για την ανάπτυξη εφαρμογών Macintosh, όπως κληρονομικότητα και πολυμορφισμό. Η γλώσσα βασίζεται στη γλώσσα προγραμματισμού C. Επομένως, μπορείτε να χρησιμοποιήσετε τις γνώσεις προγραμματισμού C για να κωδικοποιήσετε μέσα στο Objective-C. Το Objective-C++ είναι ένας μηχανισμός γέφυρας που επιτρέπει στις μονάδες πηγής Objective-C να λειτουργούν με κλάσεις Objective-C++, οι οποίες θα μπορούσαν να μεταγλωττίσουν και να συνδεθούν με βιβλιοθήκες κώδικα C++.
Το ακόλουθο απλό παράδειγμα τετράγωνου πίνακα δείχνει τα περιεχόμενα ενός αρχείου κεφαλίδας C++ για μια κλάση Matrix. Η κλάση Matrix συνοδεύεται από τον τυπικό κατασκευαστή και καταστροφέα για μια κλάση C++ και οι μέθοδοι είναι αυτές που θα περιμένατε για ένα βασικό αντικείμενο τετραγωνικού πίνακα:
τάξη Matrix
{
δημόσιο:
Matrix( int inSize );
εικονική ~Matrix();
int getSize( void );
int getDeterminant( void );
void setElement( int inRow, int inCol, int inValue );
int getElement( int inRow, int inCol );
Operator matrix+( 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:
- (void)addTwoMatrices
{
Matrix matrixOne( 3 ); // μήτρα 3x3
Matrix 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 );
}
}
Matrix matrixSum = matrixOne + matrixTwo;
Με το Objective-C++, οι εφαρμογές σας μπορούν να επωφεληθούν από όλες τις διαθέσιμες βιβλιοθήκες τρίτων κατασκευαστών που είναι γραμμένες για C++.