Objective-C Language
Grunddatentypen
Suche…
Syntax
- BOOL havePlutonium = JA; // Direktzuweisung
- BOOL fastEnough = (car.speedInMPH> = 88); // Vergleichsausdruck
- BOOL fluxCapacitorActive = (havePlutonium && fastEnough); // Boolescher Ausdruck
- id somethingWicked = [witchesCupboard lastObject]; // Ruft ein nicht typisiertes Objekt ab
- ID Pulver = prepareWickedIngredient (etwasWicked); // Pass und zurück
- if ([Zutat isKindOfClass: [Toad-Klasse]])) {// Laufzeittyp testen
BOOL
Der BOOL
Typ wird für boolesche Werte in Objective-C verwendet. Es hat zwei Werte, YES
und NO
, im Gegensatz zu den allgemeineren Werten "wahr" und "falsch".
Sein Verhalten ist unkompliziert und identisch mit der Sprache C.
BOOL areEqual = (1 == 1); // areEqual is YES
BOOL areNotEqual = !areEqual // areNotEqual is NO
NSCAssert(areEqual, "Mathematics is a lie"); // Assertion passes
BOOL shouldFlatterReader = YES;
if (shouldFlatterReader) {
NSLog(@"Only the very smartest programmers read this kind of material.");
}
Ein BOOL
ist ein BOOL
und kann daher nicht direkt in einer Foundation-Sammlung gespeichert werden. Es muss in einer NSNumber
verpackt NSNumber
. Clang bietet hierfür eine spezielle Syntax:
NSNumber * yes = @YES; // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO; // Equivalent to [NSNumber numberWithBool:NO]
Die BOOL
- Implementierung auf C ist direkt basiert, dass es sich um eine typedef des C99 Standardtyp ist bool
. Die YES
und NO
Werte sind zu __objc_yes
bzw. __objc_no
definiert. Diese speziellen Werte sind von Clang eingeführte Compiler-Builtins, die in (BOOL)1
und (BOOL)0
. Wenn sie nicht verfügbar sind, werden YES
und NO
direkt als Ganzzahlform definiert. Die Definitionen befinden sich im Objective-C-Laufzeitheader objc.h
Ich würde
id
ist der generische Objektzeiger, ein Objective-C-Typ, der "beliebiges Objekt" darstellt. Eine Instanz einer beliebigen Objective-C-Klasse kann in einer id
Variablen gespeichert werden. Eine id
und jeder andere Klassentyp kann ohne Casting hin und her zugewiesen werden:
id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];
Dies wird relevant, wenn Objekte aus einer Sammlung abgerufen werden. Die Rückgabetypen von Methoden wie objectAtIndex:
sind aus genau diesem Grund id
.
DataRecord * record = [records objectAtIndex:anIndex];
Dies bedeutet auch, dass ein als id
eingegebener Methoden- oder Funktionsparameter ein beliebiges Objekt akzeptieren kann.
Wenn ein Objekt als id
eingegeben wird, kann eine beliebige bekannte Nachricht an das Objekt übergeben werden.
NSString * extinctBirdMaybe =
[anonymousSurname stringByAppendingString:anonymousSurname];
Eine Nachricht, auf die das Objekt eigentlich nicht reagiert, führt zur Laufzeit natürlich immer noch zu einer Ausnahme.
NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception
Schutz vor Ausnahmen
NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
nope = [anonymousSurname addTimeInterval:10];
}
Der id
Typ ist in objc.h definiert
typedef struct objc_object {
Class isa;
} *id;
SEL
Selektoren werden in Objective-C als Methodenbezeichner verwendet.
Im folgenden Beispiel gibt es zwei Selektoren. new
und setName:
Person* customer = [Person new];
[customer setName:@"John Doe"];
Jedes Paar von Klammern entspricht einer gesendeten Nachricht. In der ersten Zeile senden wir eine Nachricht mit dem new
Selector an die Person
Klasse und in der zweiten Zeile senden wir eine Nachricht mit dem setName:
Selector und einer Zeichenfolge. Der Empfänger dieser Nachrichten verwendet den Selektor, um die richtige Aktion zu ermitteln.
In den meisten Fällen ist das Übergeben von Nachrichten mit der Klammer-Syntax ausreichend, aber gelegentlich müssen Sie mit dem Selektor selbst arbeiten. In diesen Fällen kann der SEL
Typ verwendet werden, um einen Verweis auf den Selektor zu halten.
Wenn der Selektor zur Kompilierzeit verfügbar ist, können Sie mit @selector()
einen Verweis darauf erhalten.
SEL s = @selector(setName:);
Wenn Sie den Selector zur Laufzeit finden müssen, verwenden Sie NSSelectorFromString.
SEL s NSSelectorFromString(@"setName:");
Achten Sie bei der Verwendung von NSSelectorFromString darauf, den Selektornamen in einen NSString einzuhüllen.
Sie wird häufig verwendet, um zu überprüfen, ob ein Delegat eine optionale Methode implementiert.
if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
[self.myDelegate doSomething];
}
IMP (Implementierungszeiger)
IMP ist ein C-Typ, der sich auf die Implementierung einer Methode bezieht, die auch als Implementierungszeiger bezeichnet wird. Es ist ein Zeiger auf den Beginn einer Methodenimplementierung.
Syntax:
id (*IMP)(id, SEL, …)
IMP wird definiert durch:
typedef id (*IMP)(id self,SEL _cmd,…);
Für den Zugriff auf diesen IMP kann die Nachricht "methodForSelector" verwendet werden.
Beispiel 1:
IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];
Die vom IMP adressierte Methode kann durch Dereferenzierung des IMP aufgerufen werden.
ImpDoSomething(myObject, @selector(doSomething));
Also sind diese Aufrufe gleich:
myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];
Beispiel: 2:
SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");
IMP methodImplementation = [self methodForSelector:otherWaySelector];
result = methodImplementation( self,
betterWaySelector,
first,
second,
third );
NSLog(@"methodForSelector : %@", result);
Hier rufen wir [NSObject methodForSelector auf, der einen Zeiger auf die C-Funktion zurückgibt, die die Methode tatsächlich implementiert, die wir anschließend direkt aufrufen können.
NSInteger und NSUInteger
Der NSInteger ist nur ein Typedef für ein Int oder ein Long, je nach Architektur. Dasselbe gilt für einen NSUInteger, der für die unsignierten Varianten ein Typedef ist. Wenn Sie den NSInteger überprüfen, wird Folgendes angezeigt:
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
Der Unterschied zwischen einem vorzeichenbehafteten und einem vorzeichenlosen int oder long ist, dass ein vorzeichenbehafteter int oder long negative Werte enthalten kann. Der Bereich des Int ist -2 147 483 648 bis 2 147 483 647, während der vorzeichenlose Int einen Bereich von 0 bis 4 294 967 295 hat. Der Wert wird verdoppelt, da das erste Bit nicht mehr verwendet wird, um anzugeben, dass der Wert negativ ist oder nicht. Für eine lange und NSInteger auf 64-Bit-Architektur ist der Bereich viel größer.
Die meisten von Apple bereitgestellten Methoden geben eine NS (U) Integer über den normalen Int zurück. Sie erhalten eine Warnung, wenn Sie versuchen, es in ein normales int umzuwandeln, da Sie bei einer 64-Bit-Architektur an Genauigkeit verlieren. In den meisten Fällen ist es nicht wichtig, aber es ist einfacher, NS (U) Integer zu verwenden. Die count-Methode für ein Array gibt beispielsweise einen NSUInteger zurück.
NSNumber *iAmNumber = @0;
NSInteger iAmSigned = [iAmNumber integerValue];
NSUInteger iAmUnsigned = [iAmNumber unsignedIntegerValue];
NSLog(@"%ld", iAmSigned); // The way to print a NSInteger.
NSLog(@"%lu", iAmUnsigned); // The way to print a NSUInteger.
Genau wie bei einer BOOL ist die NS (U) Integer-Zahl ein primitiver Datentyp. Daher müssen Sie sie manchmal in eine NSNumber einschließen. Sie können das @ vor der Integer-Zahl verwenden, um sie wie oben darzustellen und sie mithilfe der folgenden Methoden abzurufen. Um es in NSNumber umzuwandeln, können Sie auch die folgenden Methoden verwenden:
[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];