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];


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow