Els blocs i clausures són una característica poderosa d'Objective-C que permeten encapsular codi en una unitat que es pot passar com a argument a mètodes o funcions, emmagatzemar en variables i executar en un moment posterior. Aquesta funcionalitat és similar a les funcions lambda o anònimes en altres llenguatges de programació.

Conceptes Clau

Què és un Bloc?

Un bloc és un fragment de codi que es pot executar més tard. Els blocs poden capturar i emmagatzemar variables de l'entorn en què es defineixen, cosa que els fa molt útils per a operacions asíncrones i callbacks.

Sintaxi Bàsica

La sintaxi bàsica per definir un bloc és la següent:

^returnType (parameters) {
    // Codi del bloc
};

Exemple Simple

Aquí teniu un exemple simple d'un bloc que suma dos nombres:

int (^sumBlock)(int, int) = ^int(int a, int b) {
    return a + b;
};

int result = sumBlock(3, 4); // result és 7

Blocs com a Paràmetres

Els blocs es poden passar com a paràmetres a funcions o mètodes. Això és especialment útil per a callbacks o operacions asíncrones.

Exemple amb Paràmetres

void performOperation(int (^operationBlock)(int, int)) {
    int result = operationBlock(5, 3);
    NSLog(@"Resultat: %d", result);
}

int (^multiplyBlock)(int, int) = ^int(int a, int b) {
    return a * b;
};

performOperation(multiplyBlock); // Resultat: 15

Captura de Variables

Els blocs poden capturar variables de l'entorn en què es defineixen. Aquestes variables es poden utilitzar dins del bloc.

Exemple de Captura de Variables

int multiplier = 3;
int (^multiplyBlock)(int) = ^int(int num) {
    return num * multiplier;
};

int result = multiplyBlock(4); // result és 12

Blocs i Memòria

Els blocs poden capturar variables de l'entorn, cosa que pot afectar la gestió de memòria. És important comprendre com es gestionen els blocs per evitar fuites de memòria.

Copiar Blocs

Els blocs que es passen fora del seu àmbit original s'han de copiar per assegurar-se que es mantinguin en memòria.

void performOperationWithBlock(void (^operationBlock)(void)) {
    void (^copiedBlock)(void) = [operationBlock copy];
    copiedBlock();
    [copiedBlock release];
}

Exercicis Pràctics

Exercici 1: Bloc Simple

Defineix un bloc que multipliqui dos nombres i imprimeixi el resultat.

int (^multiplyBlock)(int, int) = ^int(int a, int b) {
    return a * b;
};

int result = multiplyBlock(2, 3);
NSLog(@"Resultat: %d", result); // Resultat: 6

Exercici 2: Bloc com a Paràmetre

Escriu una funció que accepti un bloc com a paràmetre i l'utilitzi per sumar dos nombres.

void performSumOperation(int (^sumBlock)(int, int)) {
    int result = sumBlock(10, 20);
    NSLog(@"Resultat de la suma: %d", result);
}

int (^sumBlock)(int, int) = ^int(int a, int b) {
    return a + b;
};

performSumOperation(sumBlock); // Resultat de la suma: 30

Exercici 3: Captura de Variables

Defineix un bloc que capturi una variable externa i la utilitzi per multiplicar un nombre.

int factor = 5;
int (^multiplyWithFactorBlock)(int) = ^int(int num) {
    return num * factor;
};

int result = multiplyWithFactorBlock(4);
NSLog(@"Resultat amb factor: %d", result); // Resultat amb factor: 20

Resum

En aquesta secció, hem après sobre els blocs i clausures en Objective-C, incloent la seva sintaxi, com passar-los com a paràmetres, la captura de variables i la gestió de memòria. Els blocs són una eina poderosa per escriure codi més flexible i modular, especialment en operacions asíncrones i callbacks. Practicar amb blocs t'ajudarà a comprendre millor com utilitzar-los de manera efectiva en els teus projectes.

© Copyright 2024. Tots els drets reservats