En Objective-C, els mètodes es poden classificar en dues categories principals: mètodes de classe i mètodes d'instància. Aquesta distinció és fonamental per entendre com es defineixen i utilitzen les funcions dins de les classes.

Mètodes de Classe

Definició

Els mètodes de classe són aquells que es poden cridar directament sobre la classe sense necessitat de crear una instància d'aquesta. Són útils per a operacions que no depenen de l'estat d'una instància específica.

Sintaxi

Per definir un mètode de classe, es fa servir el signe + abans de la declaració del mètode.

@interface MyClass : NSObject

+ (void)classMethodExample;

@end

@implementation MyClass

+ (void)classMethodExample {
    NSLog(@"Aquest és un mètode de classe.");
}

@end

Crida

Per cridar un mètode de classe, es fa servir el nom de la classe seguit del mètode.

[MyClass classMethodExample];

Mètodes d'Instància

Definició

Els mètodes d'instància són aquells que es criden sobre una instància específica de la classe. Aquests mètodes poden accedir i modificar les propietats de l'objecte.

Sintaxi

Per definir un mètode d'instància, es fa servir el signe - abans de la declaració del mètode.

@interface MyClass : NSObject

- (void)instanceMethodExample;

@end

@implementation MyClass

- (void)instanceMethodExample {
    NSLog(@"Aquest és un mètode d'instància.");
}

@end

Crida

Per cridar un mètode d'instància, primer cal crear una instància de la classe i després cridar el mètode sobre aquesta instància.

MyClass *myObject = [[MyClass alloc] init];
[myObject instanceMethodExample];

Comparació entre Mètodes de Classe i d'Instància

Característica Mètodes de Classe Mètodes d'Instància
Definició + -
Crida [MyClass classMethod] [myObject instanceMethod]
Accés a propietats No accedeix a propietats d'instància Pot accedir i modificar propietats d'instància
Ús Operacions generals, inicialització de classe Operacions específiques de l'objecte

Exemple Pràctic

A continuació, es mostra un exemple pràctic que combina mètodes de classe i d'instància per il·lustrar com es poden utilitzar conjuntament.

@interface Calculator : NSObject

+ (int)add:(int)a to:(int)b;
- (int)multiply:(int)a by:(int)b;

@end

@implementation Calculator

+ (int)add:(int)a to:(int)b {
    return a + b;
}

- (int)multiply:(int)a by:(int)b {
    return a * b;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Crida a un mètode de classe
        int sum = [Calculator add:5 to:3];
        NSLog(@"La suma és: %d", sum);
        
        // Crida a un mètode d'instància
        Calculator *calc = [[Calculator alloc] init];
        int product = [calc multiply:5 by:3];
        NSLog(@"El producte és: %d", product);
    }
    return 0;
}

Exercicis Pràctics

Exercici 1

Defineix una classe MathOperations amb un mètode de classe que calculi el quadrat d'un nombre i un mètode d'instància que calculi el cub d'un nombre.

Solució

@interface MathOperations : NSObject

+ (int)square:(int)number;
- (int)cube:(int)number;

@end

@implementation MathOperations

+ (int)square:(int)number {
    return number * number;
}

- (int)cube:(int)number {
    return number * number * number;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int squareResult = [MathOperations square:4];
        NSLog(@"El quadrat és: %d", squareResult);
        
        MathOperations *mathOps = [[MathOperations alloc] init];
        int cubeResult = [mathOps cube:3];
        NSLog(@"El cub és: %d", cubeResult);
    }
    return 0;
}

Exercici 2

Crea una classe Person amb un mètode de classe que retorni el nombre total de persones creades i un mètode d'instància que retorni el nom de la persona.

Solució

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
+ (int)totalPersons;
- (NSString *)getName;

@end

@implementation Person

static int personCount = 0;

+ (int)totalPersons {
    return personCount;
}

- (instancetype)initWithName:(NSString *)name {
    self = [super init];
    if (self) {
        _name = name;
        personCount++;
    }
    return self;
}

- (NSString *)getName {
    return _name;
}

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *person1 = [[Person alloc] initWithName:@"Alice"];
        Person *person2 = [[Person alloc] initWithName:@"Bob"];
        
        NSLog(@"Total de persones: %d", [Person totalPersons]);
        NSLog(@"Nom de la persona 1: %@", [person1 getName]);
        NSLog(@"Nom de la persona 2: %@", [person2 getName]);
    }
    return 0;
}

Conclusió

En aquesta secció, hem après la diferència entre mètodes de classe i d'instància en Objective-C, com es defineixen i com es criden. També hem vist exemples pràctics i exercicis per reforçar els conceptes apresos. Ara estàs preparat per utilitzar mètodes de classe i d'instància en els teus projectes Objective-C.

© Copyright 2024. Tots els drets reservats