Zoeken…


Syntaxis

  • BOOL havePlutonium = JA; // Directe opdracht
  • BOOL fastEnough = (car.speedInMPH> = 88); // Vergelijkingsuitdrukking
  • BOOL fluxCapacitorActive = (havePlutonium && fastEnough); // Booleaanse uitdrukking
  • id somethingWicked = [witchesCupboard lastObject]; // Untyped object ophalen
  • id poeder = prepareWickedIngredient (somethingWicked); // Pass en terugkeer
  • if ([ingrediënt isKindOfClass: [Toad-klasse]]) {// Testduur

BOOL

Het BOOL type wordt gebruikt voor Booleaanse waarden in Objective-C. Het heeft twee waarden, YES en NO , in tegenstelling tot de meer algemene "waar" en "onwaar".

Het gedrag is eenvoudig en identiek aan die van de C-taal.

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.");
}

Een BOOL is een primitief en kan daarom niet rechtstreeks in een Foundation-verzameling worden opgeslagen. Het moet in een NSNumber worden verpakt. Clang biedt hiervoor speciale syntaxis:

NSNumber * yes = @YES;    // Equivalent to [NSNumber numberWithBool:YES]
NSNumber * no = @NO;    // Equivalent to [NSNumber numberWithBool:NO]

De BOOL implementatie is rechtstreeks gebaseerd op C's, in dat het een typedef van de C99 standaard type bool . De waarden YES en NO zijn respectievelijk gedefinieerd als __objc_yes en __objc_no . Deze speciale waarden zijn compiler buildins geïntroduceerd door Clang, die worden vertaald naar (BOOL)1 en (BOOL)0 . Als ze niet beschikbaar zijn, worden YES en NO rechtstreeks gedefinieerd als de cast-integer-vorm. De definities zijn te vinden in de Objective-C runtime header objc.h

ID kaart

id is de generieke objectpointer, een Objective-C-type dat "elk object" vertegenwoordigt. Een exemplaar van een klasse Objective-C kan worden opgeslagen in een id variabele. Een id en elk ander klassetype kunnen heen en weer worden toegewezen zonder te casten:

id anonymousSurname = @"Doe";
NSString * surname = anonymousSurname;
id anonymousFullName = [NSString stringWithFormat:@"%@, John", surname];

Dit wordt relevant bij het ophalen van objecten uit een verzameling. De objectAtIndex: methoden zoals objectAtIndex: zijn om precies deze reden id .

DataRecord * record = [records objectAtIndex:anIndex];  

Het betekent ook dat een methode of functieparameter die als id is getypt, elk object kan accepteren.

Wanneer een object als id wordt getypt, kan elk bekend bericht eraan worden doorgegeven: methode verzending is niet afhankelijk van het type compilatie.

NSString * extinctBirdMaybe = 
               [anonymousSurname stringByAppendingString:anonymousSurname];

Een bericht waarop het object niet echt reageert, zal natuurlijk nog steeds een uitzondering tijdens runtime veroorzaken.

NSDate * nope = [anonymousSurname addTimeInterval:10];
// Raises "Does not respond to selector" exception

Bewaken tegen uitzondering.

NSDate * nope;
if([anonymousSurname isKindOfClass:[NSDate class]]){
    nope = [anonymousSurname addTimeInterval:10];
}

Het id type is gedefinieerd in objc.h

typedef struct objc_object {
    Class isa;
} *id;

SEL

Selectors worden gebruikt als methode-ID's in Objective-C.

In het onderstaande voorbeeld zijn er twee selectors. new en setName:

Person* customer = [Person new];
[customer setName:@"John Doe"];

Elk paar haakjes komt overeen met een verzonden bericht. Op de eerste regel sturen we een bericht met de new selector naar de klasse Person en op de tweede regel sturen we een bericht met de setName: selector en een tekenreeks. De ontvanger van deze berichten gebruikt de selector om de juiste actie op te zoeken.

Meestal is het doorgeven van berichten met behulp van de bracket-syntaxis voldoende, maar soms moet u met de selector zelf werken. In deze gevallen kan het SEL type worden gebruikt om een verwijzing naar de selector te bevatten.

Als de selector beschikbaar is tijdens het compileren, kunt u @selector() gebruiken om ernaar te verwijzen.

SEL s = @selector(setName:);

En als u de selector tijdens runtime moet vinden, gebruikt u NSSelectorFromString.

SEL s NSSelectorFromString(@"setName:");

Wanneer u NSSelectorFromString gebruikt, zorg er dan voor dat u de selectornaam in een NSString wikkelt.

Het wordt meestal gebruikt om te controleren of een gemachtigde een optionele methode implementeert.

if ([self.myDelegate respondsToSelector:@selector(doSomething)]) {
    [self.myDelegate doSomething];
}

IMP (implementatie pointer)

IMP is een C-type dat verwijst naar de implementatie van een methode, ook bekend als een implementatie-aanwijzer. Het is een verwijzing naar het begin van de implementatie van een methode.

Syntaxis:

id (*IMP)(id, SEL, …)

IMP wordt gedefinieerd door:

typedef id (*IMP)(id self,SEL _cmd,…);

Om toegang te krijgen tot deze IMP, kan het bericht "methodForSelector" worden gebruikt.

Voorbeeld 1:

IMP ImpDoSomething = [myObject methodForSelector:@selector(doSomething)];

De door de IMP geadresseerde methode kan worden opgeroepen door de IMP te verwijderen.

ImpDoSomething(myObject, @selector(doSomething));

Dus deze oproepen zijn gelijk:

 myImpDoSomething(myObject, @selector(doSomething));
[myObject doSomething]
[myObject performSelector:mySelector]
[myObject performSelector:@selector(doSomething)]
[myObject performSelector:NSSelectorFromString(@"doSomething")];

Voorbeeld: 2:

SEL otherWaySelector = NSSelectorFromString(@“methodWithFirst:andSecond:andThird:");

IMP methodImplementation  = [self methodForSelector:otherWaySelector];

result = methodImplementation( self,
                          betterWaySelector,
                          first,
                          second,
                          third );

NSLog(@"methodForSelector : %@", result);

Hier noemen we [NSObject methodForSelector die ons een pointer teruggeeft naar de C-functie die de methode daadwerkelijk implementeert, die we vervolgens direct kunnen aanroepen.

NSInteger en NSUInteger

Het NSInteger is slechts een typefef voor een int of een long, afhankelijk van de architectuur. Hetzelfde geldt voor een NSUInteger dat een typefout is voor de niet-ondertekende varianten. Als u het NSInteger aanvinkt, ziet u het volgende:

#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

Het verschil tussen een ondertekende en een niet-ondertekende int of lang is dat een ondertekende int of lang negatieve waarden kan bevatten. Het bereik van de int is -2 147 483 648 tot 2 147 483 647 terwijl de niet-ondertekende int een bereik heeft van 0 tot 4 294 967 295. De waarde wordt verdubbeld omdat het eerste bit niet meer wordt gebruikt om te zeggen dat de waarde negatief is of niet. Voor een lang en NSInteger op 64-bit architecturen is het bereik veel groter.

De meeste methoden die Apple biedt, retourneren een NS (U) -getal boven de normale int. Je krijgt een waarschuwing als je het naar een normale int probeert te casten, omdat je precisie verliest als je op een 64-bit architectuur werkt. Niet dat het in de meeste gevallen van belang is, maar het is gemakkelijker om een NS (U) Integer te gebruiken. De telmethode op een array retourneert bijvoorbeeld een NSUInteger.

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.

Net als een BOOL is het NS (U) -getal een primitief gegevenstype, dus u moet het soms in een NS-nummer wikkelen. U kunt het @ vóór het gehele getal gebruiken om het te casten zoals hierboven en het op te halen met behulp van de onderstaande methoden. Maar om het naar NSNumber te casten, kunt u ook de volgende methoden gebruiken:

[NSNumber numberWithInteger:0];
[NSNumber numberWithUnsignedInteger:0];


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow