Ten en cuenta que los programas escritos en Objective-C conservan sus declaraciones de clase cuando se compilan en binarios Mach-O. Estas declaraciones de clase incluyen el nombre y tipo de:
La clase
Los métodos de clase
Las variables de instancia de clase
Puedes obtener esta información utilizando class-dump:
class-dumpKindle.app
Clases, Métodos y Objetos
Interfaz, Propiedades y Métodos
// Declare the interface of the class
@interface MyVehicle : NSObject
// Declare the properties
@property NSString *vehicleType;
@property int numberOfWheels;
// Declare the methods
- (void)startEngine;
- (void)addWheels:(int)value;
@end
Clase
@implementation MyVehicle : NSObject
// No need to indicate the properties, only define methods
- (void)startEngine {
NSLog(@"Engine started");
}
- (void)addWheels:(int)value {
self.numberOfWheels += value;
}
@end
Objeto y Método de Llamada
Para crear una instancia de una clase se llama al método alloc que asigna memoria para cada propiedad y pone a cero esas asignaciones. Luego se llama a init, que inicializa las propiedades a los valores requeridos.
// Something like this:
MyVehicle *newVehicle = [[MyVehicle alloc] init];
// Which is usually expressed as:
MyVehicle *newVehicle = [MyVehicle new];
// To call a method
// [myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]
[newVehicle addWheels:4];
Métodos de Clase
Los métodos de clase se definen con el signo más (+) no con el guion (-) que se usa con los métodos de instancia. Como el método de clase de la clase NSStringstringWithString:
+ (id)stringWithString:(NSString *)aString;
Setter & Getter
Para establecer y obtener propiedades, puedes hacerlo con una notación de punto o como si estuvieras llamando a un método:
// Set
newVehicle.numberOfWheels = 2;
[newVehicle setNumberOfWheels:3];
// Get
NSLog(@"Number of wheels: %i", newVehicle.numberOfWheels);
NSLog(@"Number of wheels: %i", [newVehicle numberOfWheels]);
Variables de Instancia
Alternativamente a los métodos setter & getter, puedes usar variables de instancia. Estas variables tienen el mismo nombre que las propiedades pero comienzan con un "_":
Los protocolos son un conjunto de declaraciones de métodos (sin propiedades). Una clase que implementa un protocolo implementa los métodos declarados.
Existen 2 tipos de métodos: obligatorios y opcionales. Por defecto, un método es obligatorio (pero también se puede indicar con la etiqueta @required). Para indicar que un método es opcional, se utiliza @optional.
Las clases básicas son inmutables, por lo que para agregar una cadena a una existente se necesita crear un nuevo NSString.
NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear];
O también podrías usar una clase de cadena mutable:
NSMutableString *mutableString = [NSMutableString stringWithString:@"The book "];
[mutableString appendString:bookTitle];
[mutableString appendString:@" was written by "];
[mutableString appendString:bookAuthor];
[mutableString appendString:@" and published in "];
[mutableString appendString:bookPublicationYear];
Número
// character literals.
NSNumber *theLetterZ = @'Z'; // equivalent to [NSNumber numberWithChar:'Z']
// integral literals.
NSNumber *fortyTwo = @42; // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L; // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL]
// floating point literals.
NSNumber *piFloat = @3.141592654F; // equivalent to [NSNumber numberWithFloat:3.141592654F]
NSNumber *piDouble = @3.1415926535; // equivalent to [NSNumber numberWithDouble:3.1415926535]
// BOOL literals.
NSNumber *yesNumber = @YES; // equivalent to [NSNumber numberWithBool:YES]
NSNumber *noNumber = @NO; // equivalent to [NSNumber numberWithBool:NO]
Los bloques son funciones que se comportan como objetos, por lo que pueden ser pasados a funciones o almacenados en arrays o dictionaries. Además, pueden representar un valor si se les asignan valores, por lo que son similares a las lambdas.
returnType (^blockName)(argumentType1, argumentType2, ...) = ^(argumentType1 param1, argumentType2 param2, ...){
//Perform operations here
};
// For example
int (^suma)(int, int) = ^(int a, int b){
return a+b;
};
NSLog(@"3+4 = %d", suma(3,4));
También es posible definir un tipo de bloque para ser utilizado como parámetro en funciones:
// Define the block type
typedef void (^callbackLogger)(void);
// Create a bloack with the block type
callbackLogger myLogger = ^{
NSLog(@"%@", @"This is my block");
};
// Use it inside a function as a param
void genericLogger(callbackLogger blockParam) {
NSLog(@"%@", @"This is my function");
blockParam();
}
genericLogger(myLogger);
// Call it inline
genericLogger(^{
NSLog(@"%@", @"This is my second block");
});
Archivos
// Manager to manage files
NSFileManager *fileManager = [NSFileManager defaultManager];
// Check if file exists:
if ([fileManager fileExistsAtPath:@"/path/to/file.txt" ] == YES) {
NSLog (@"File exists");
}
// copy files
if ([fileManager copyItemAtPath: @"/path/to/file1.txt" toPath: @"/path/to/file2.txt" error:nil] == YES) {
NSLog (@"Copy successful");
}
// Check if the content of 2 files match
if ([fileManager contentsEqualAtPath:@"/path/to/file1.txt" andPath:@"/path/to/file2.txt"] == YES) {
NSLog (@"File contents match");
}
// Delete file
if ([fileManager removeItemAtPath:@"/path/to/file1.txt" error:nil]) {
NSLog(@"Removed successfully");
}
También es posible gestionar archivos utilizando objetos NSURL en lugar de objetos NSString. Los nombres de los métodos son similares, pero con URL en lugar de Path.
La mayoría de las clases básicas tienen un método writeToFile:<path> atomically:<YES> encoding:<encoding> error:nil definido que les permite ser escritas directamente en un archivo: