Notez que les programmes écrits en Objective-C conservent leurs déclarations de classe lorsqu'ils sontcompilés en binaires Mach-O. Ces déclarations de classe incluent le nom et le type de :
La classe
Les méthodes de classe
Les variables d'instance de classe
Vous pouvez obtenir ces informations en utilisant class-dump:
class-dumpKindle.app
Classes, Méthodes & Objets
Interface, Propriétés & Méthodes
// 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
Classe
@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
Objet & Méthode d'Appel
Pour créer une instance d'une classe, la méthode alloc est appelée, qui alloue de la mémoire pour chaque propriété et met à zéro ces allocations. Ensuite, init est appelé, ce qui initialise les propriétés aux valeurs requises.
// 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éthodes de classe
Les méthodes de classe sont définies avec le signe plus (+) et non le trait d'union (-) utilisé avec les méthodes d'instance. Comme la méthode de classe de la classe NSStringstringWithString:
+ (id)stringWithString:(NSString *)aString;
Setter & Getter
Pour définir et obtenir des propriétés, vous pouvez le faire avec une notation pointée ou comme si vous appeliez une méthode:
// Set
newVehicle.numberOfWheels = 2;
[newVehicle setNumberOfWheels:3];
// Get
NSLog(@"Number of wheels: %i", newVehicle.numberOfWheels);
NSLog(@"Number of wheels: %i", [newVehicle numberOfWheels]);
Variables d'instance
Alternativement aux méthodes setter & getter, vous pouvez utiliser des variables d'instance. Ces variables ont le même nom que les propriétés mais commencent par un "_":
Les protocoles sont des ensembles de déclarations de méthodes (sans propriétés). Une classe qui implémente un protocole met en œuvre les méthodes déclarées.
Il existe 2 types de méthodes : obligatoires et optionnelles. Par défaut, une méthode est obligatoire (mais vous pouvez également l'indiquer avec une balise @required). Pour indiquer qu'une méthode est optionnelle, utilisez @optional.
Les classes de base sont immuables, donc pour ajouter une chaîne à une existante, un nouveau NSString doit être créé.
NSString *bookDescription = [NSString stringWithFormat:@"%@ by %@ was published in %@", bookTitle, bookAuthor, bookPublicationYear];
Ou vous pourriez également utiliser une classe de chaîne 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];
Numéro
// 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]
Il est également possible de définir un type de bloc à utiliser comme paramètre dans les fonctions :
// 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");
});
Fichiers
// 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");
}
Il est également possible de gérer les fichiers en utilisant des objets NSURL au lieu d'objets NSString. Les noms des méthodes sont similaires, mais avec URL au lieu de Path.
La plupart des classes de base ont une méthode writeToFile:<path> atomically:<YES> encoding:<encoding> error:nil définie qui leur permet d'être directement écrites dans un fichier: