Τι θα συμβεί αν προσεγγίσουμε το αντικείμενο;
sobes.tech AI
Απάντηση από AI
Αποστολή μηνύματος σε ένα αντικείμενο. Εάν το αντικείμενο έχει μια μέθοδο με το αντίστοιχο όνομα (selector), αυτή θα εκτελεστεί. Αν όχι, θα προκληθεί σφάλμα εκτέλεσης (μη αναγνωρισμένος selector που στάλθηκε σε μια περίπτωση), εκτός αν το αντικείμενο υλοποιεί μηχανισμό ανακατεύθυνσης μηνυμάτων.
Ο μηχανισμός ανακατεύθυνσης μηνυμάτων σε Objective-C/Swift αποτελείται από διάφορα στάδια:
- Δυναμική διανομή: Το περιβάλλον εκτέλεσης αναζητά την υλοποίηση της μεθόδου (IMP) για αυτόν τον selector στην κλάση του αντικειμένου και στις υπερκλάσεις του.
- Δυναμική προσθήκη μεθόδων: Αν η υλοποίηση δεν βρεθεί, το περιβάλλον εκτέλεσης καλεί τη μέθοδο
+resolveInstanceMethod:(για στιγμιότυπα) ή+resolveClassMethod:(για κλάσεις), δίνοντας στη κλάση την ευκαιρία να προσθέσει δυναμικά την υλοποίηση της μεθόδου. - Ανακατεύθυνση μηνυμάτων: Αν η μέθοδος ακόμα δεν βρεθεί ή προστεθεί, το περιβάλλον εκτέλεσης προσπαθεί να ανακατευθύνει το μήνυμα σε ένα άλλο αντικείμενο, καλώντας τις μεθόδους
forwardingTargetForSelector:και στη συνέχειαmethodSignatureForSelector:καιforwardInvocation:.
Αν κανένα από αυτά τα στάδια δεν οδηγήσει στην επεξεργασία του μηνύματος, προκύπτει εξαίρεση NSInvalidArgumentException.
Παράδειγμα σε Objective-C:
@implementation MyObject
- (void)myMethod {
// Υλοποίηση μεθόδου
NSLog(@"myMethod called");
}
@end
// ...
MyObject *obj = [[MyObject alloc] init];
[obj myMethod]; // Αποστολή μηνύματος myMethod
Παράδειγμα σε Swift (αυτονόητο):
class MySwiftObject {
func mySwiftMethod() {
// Υλοποίηση μεθόδου
print("mySwiftMethod called")
}
}
let swiftObj = MySwiftObject()
swiftObj.mySwiftMethod() // Αποστολή μηνύματος mySwiftMethod (μέσω δυναμικής διανομής από προεπιλογή)
Η πρόσβαση στις ιδιότητες του αντικειμένου σε Swift από προεπιλογή χρησιμοποιεί στατική διανομή για let και var χωρίς @objc dynamic. Ωστόσο, αν η ιδιότητα σημειωθεί ως @objc dynamic, η πρόσβαση σε αυτή θα χρησιμοποιεί επίσης δυναμική διανομή, παρόμοια με την αποστολή μηνυμάτων σε Objective-C.