Video: Learning iOS: Create your own app with Objective-C! by Tianyu Liu 2025
Ett protokoll definierar uppsättningar metoder som kan genomföras av vilken klass som helst. Tänk på protokoll som definierar gränssnitt som klasser måste genomföra. Protokoll används ofta för att ange gränssnittet för delegerade objekt.
Med protokollfunktionen kan du undvika att tvinga underklassen för att skapa polymorfa klasser. Mål-C (till skillnad från C ++) tillåter inte att en klass har flera superklasser. Protokoll är därför ett viktigt inslag i Mål-C eftersom det inte tillåter flera arv.
När en klass genomför metoderna i ett protokoll sägs klassen att överensstämma med protokollet.
Definitionen av ett protokoll liknar definitionen av ett gränssnitt för en klass. Ett protokoll har emellertid inte en föräldraklass eller instansvariabler. Här är ett exempel på en protokolldefinition (Printable) från postfix-kalkylatorns program:
@protocol Printable - (void) printMe; // Jag kan lämna ut @required, eftersom det är standard @optional - (NSString *) printMeToString; -d
Med ankomsten (och med stor fanfare) av Objective-C 2.0 kan protokollmetoder antingen vara obligatoriska (standard) eller valfritt.
Här är StackOfIntegers deklaration om att det kommer att implementera protokollet: @interface StackOfInteger: NSObject … -d
Här är implementeringen av protokollet i StackOfInteger-klassen:
@implementation StackOfInteger; … Andra StackOfInteger metoder … /////////// Metoder för att genomföra det skrivbara protokollet //////////// - (void) printMe {int k, stackCount = [elementantal]; NSLog (@ "Stack-> Last>% dlast); för (k = 0; k% @Observera att metoden printMeToString inte implementeras eftersom den är valfri.
< ! - 1 -> Ett program kan testa om ett objekt överensstämmer med ett protokoll. Följande kod innehåller exempel på detta test (taget från provprogrammets huvudprogram):
printf ("Testa överensstämmelse med protokollsn "), om ([myStack conformsToProtocol: @protocol (Printable)]) {printf (" Använd protokoll methodsn "); [myStack printMe];} else {NSLog (@" Objektet överensstämmer inte med protokollet% @ n " @protocol (Utskrivbar));} id someObject = [[PostfixCalculator allokera initWithExpression: @ "44 55 *"]; om (! [someObject conformsToProtocol: @protocol (Utskrivbar)]) {NSLog (@ "Objektet överensstämmer inte med protokollet ");}Eftersom myStack-objektet överensstämmer med protokollet kallas dess metoder för printMe och printMeToString. Eftersom someObject (vilket är typ-ID för att göra exemplet mer meningsfullt) inte överensstämmer med det skrivbara protokollet, testet för överensstämmelse misslyckas.
Du kan också testa om det finns en valfri metod som använder metoden RespondToSelector.
Du kan göra en klass anta ett protokoll genom att helt enkelt genomföra de metoder som definieras av det protokollet. Det betyder att du inte måste förklara protokollet i dess gränssnitt. Men även om klassen implementerar protokollmetoderna kommer det inte att överensstämma med protokollet och misslyckas med det föregående konformitetsprovet.
