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:
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.
Curs de Programació en Objective-C
Mòdul 1: Introducció a Objective-C
- Introducció a Objective-C
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsiques
- Tipus de Dades i Variables
- Operadors i Expressions
Mòdul 2: Flux de Control
Mòdul 3: Funcions i Mètodes
- Definició i Crida de Funcions
- Paràmetres de Funció i Valors de Retorn
- Sintaxi de Mètodes en Objective-C
- Mètodes de Classe i d'Instància
Mòdul 4: Programació Orientada a Objectes
Mòdul 5: Gestió de Memòria
- Introducció a la Gestió de Memòria
- Comptatge Automàtic de Referències (ARC)
- Retenció i Alliberament Manual
- Millors Pràctiques de Gestió de Memòria
Mòdul 6: Temes Avançats
Mòdul 7: Treballant amb Dades
- Gestió d'Arxius
- Serialització i Deserialització
- Conceptes Bàsics de Xarxes
- Treballant amb JSON i XML
Mòdul 8: Desenvolupament d'Interfícies d'Usuari
- Introducció a UIKit
- Vistes i Controladors de Vista
- Disseny Automàtic
- Gestió de l'Entrada de l'Usuari