2010-08-04 8 views
37

Ich würde gerne die Bedeutung der unten geschriebenen Zeilen mit einem Beispiel kennen. Ich verstehe nicht, was die Zeilen eigentlich bedeuten. Die Zeilen stammen von googles Ziel-c-Codierungsrichtlinien.Was bedeutet isa in objective-c?

Initialisierung
initialisieren Sie keine Variablen auf 0 oder null in der init-Methode; es ist überflüssig.

Der gesamte Speicher für ein neu zugewiesenes Objekt wird auf 0 initialisiert (außer für isa). Daher sollten Sie die init-Methode nicht durch Neuinitialisierung von Variablen auf 0 oder nil überladen.

Antwort

82

Unter der Haube sind Objective-C-Objekte grundsätzlich C-Strukturen. Jede enthält ein Feld mit dem Namen isa, das ein Zeiger auf die Klasse ist, in der das Objekt eine Instanz ist (so weiß die Objekt- und Objective-C-Laufzeit, um was für ein Objekt es sich handelt).

Im Hinblick auf die Initialisierung der Variablen: in Objective-C sind Instanzvariablen 0 (für C Typen wie int) automatisch initialisiert oder nil (für Objective-C Objekte). Apples Richtlinien besagen, dass die Initialisierung Ihrer Ivars auf diese Werte in Ihren init Methoden redundant ist, also tun Sie es nicht. Zum Beispiel, sagen Sie eine Klasse wie folgt hatte:

@interface MyClass : NSObject 
{ 
    int myInt; 
    double myDouble; 
    MyOtherClass *myObj; 
} 
@end 

Ihre init Methode, um diese Art und Weise Schreiben überflüssig wäre, da werden diese ivars zu 0 oder nil ohnehin initialisiert werden:

@implementation MyClass 

- (id)init 
{ 
    if ((self = [super init])) { 
     myInt = 0; 
     myDouble = 0.0; 
     myObj = nil; 
    } 
    return self; 
} 

@end 

Sie tun können Sie stattdessen:

@implementation MyClass 

- (id)init 
{ 
    return [super init]; 
} 

@end 

natürlich, wenn Sie die ivars wollen andere Werte als 0 initialisiert werden oder nil, sollten Sie sie noch initialisieren:

@implementation MyClass 

- (id)init 
{ 
    if ((self = [super init])) { 
     myInit = 10; 
     myDouble = 100.0; 
     myObj = [[MyOtherClass alloc] init]; 
    } 
    return self; 
} 

@end 
+1

Danke für die Antwort, die ich über diese Linie wissen möchte. Variablen in der init-Methode nicht auf 0 oder nil initialisieren; es ist überflüssig. Wo sollen wir dieses Muster verwenden? Bedeutet das, dass wir keine Variablen in Daten initialisieren sollten Modal's –

+2

Fühlen Sie sich frei, Ihre Daten zu initialisieren - initialisieren Sie Ihre Variablen einfach nicht auf '0' oder' nil'. – sarnold

+0

Sarnold erklärte es im Grunde, aber ich aktualisierte meine Antwort, um dieses Problem anzugehen. – mipadi

29

Wenn Objekte von der Objective-C-Laufzeit zugeordnet werden, der gesamte Speicher, wo Instanzvariablen residieren wird für Sie auf Null gesetzt, so gibt es keine Notwendigkeit Instanzvariablen auf 0 oder nil. Sie können sie auf einen beliebigen Wert setzen. Einige Entwickler ignorieren die Redundanz sogar und setzen die Instanzvariablen sowieso nur auf explizite oder beschreibende Zwecke auf 0.

isa bedeutet “ ist ein ”. Jedes Objective-C-Objekt (einschließlich jeder Klasse) hat einen Zeiger isa. Die Laufzeit folgt diesem Zeiger, um zu bestimmen, welche Klasse ein Objekt ist, also weiß er, auf welche Selektoren das Objekt reagiert, was seine Superklasse ist, welche Eigenschaften das Objekt hat und so weiter.