Innholdsfortegnelse:
- Hvordan få klassen av et objekt
- Hvordan dynamisk ringe metoder
- Slik kontrollerer du beskrivelsen av et objekt
Video: Loneliness 2024
Introspeksjon refererer til fasiliteter i en iOS-app programmeringsspråk for å undersøke strukturen og andre detaljer om et objekt og dets klasse på kjøretid. Slike detaljer kan omfatte:
-
En objekts arvstreet
-
Enten det samsvarer med en bestemt protokoll
-
Enten det svarer til en bestemt melding
Når du vet hva en gjenstand er laget av, kan du programmatisk bygge meldinger å sende til det, noe som gjør programmet mye mer dynamisk.
Hvordan få klassen av et objekt
Du kan få klassen av en gjenstand ved kjøretid. Faktisk behandler Objective-C klasser som førsteklasses objekter. Hvert klasseobjekt peker på en datastruktur i minnet, har en superklasse (kjent som en metaklasse), og kan svare på meldinger som påkaller metoder.
Når du ringer en klassemetode, sender du virkelig en beskjed til objektet til klassen.
Du kan få en referanse til klassemålet for klassen ved å sende klassen en klassemelding (Gutt! Var det forvirrende å skrive.), Og du får superklassen til en klasse ved å sende Motta en superklasse melding. For eksempel kan du skrive ut klassen og superklassen til et objekt, for eksempel et StackOfInteger-objekt, som følger:
StackOfInteger * aStack = [[StackOfInteger alloc] init]; NSLog (@ "Klassen er% @, og super er% @.", [AStack klasse], [aStack superklasse]);
Hvordan dynamisk ringe metoder
Du kan da kalle en metode på et klassemåte som dette:
Klasse postfixCalculatorClass = [someObject class]; [postfixCalculatorClass performSelector: @selector (printClassDescription)];
To elementer må forklares her. For det første er @selector et kompilere -tidsdirektiv og returnerer en peker til metoden printClass. For det andre kan du da bruke PerformSelector til å faktisk ringe den metoden.
I forrige eksempel ble metodenavnet oversatt til en peker til metoden ved kompileringstid. Du kan også ringe en instansmetode på et objekt ved å bruke strengenavnet til en metode, ved kjøring, som følger:
SEL printClassDescriptionSEL = NSSelectorFromString (@ "printClassDescription"); [postfixCalculatorClass performSelector: printClassDescriptionSEL];
I dette eksemplet kan du bruke SEL-typen (også kjent som en velger i Objective-C-parlanse, og så SEL) for å holde den interne representasjonen av en metode.
Slik kontrollerer du beskrivelsen av et objekt
Når du har et håndtak til et klasseobjekt, kan du inspisere det ved kjøring med introspeksjonsfunksjonene som er oppgitt i Objective-C.For eksempel kan du teste dette objektet for å se hva slags det er. Du kan inspisere den for å se om den har en bestemt metode eller et bestemt attributt, og så videre.
Tabellen under viser alle metoder for å teste strukturen og evnen til et klassobjekt og for å utføre handlinger på den.
Metode | Spørsmål eller handling |
---|---|
- (BOOL) isKindOf: klasseobjekt | Er objektet et medlem eller en etterkommer av en klasse? |
- (BOOL) isMemberOf: class-object | Er objektet medlem av en klasse? |
- (BOOL) svarer til: velger | Kan objektet svare på en metode? |
+ (BOOL) instanserRespondTo: velger | Kan forekomster av klassen svare på en melding? |
- (id) utfør: velg | Bruk metoden som er spesifisert av väljeren. |
+ (BOOL) conformsToProtocol: (Protocol *) aProtocol | JA hvis mottakeren overholder protokollen aProtocol; ellers, nei. |
For mer informasjon om introspeksjon og hvordan du bruker den, sjekk ut Apple IOS Runtime Reference og Apple Developer Objective-C Runtime Programmeringsveiledning.