Vous avez le mot-clé retain sur vos propriétés, ce qui est bon. Mais, cela n'a pas d'importance parce que vous ne les utilisez pas réellement. Vous accédez directement aux ivars, en ignorant la méthode getter générée par le compilateur Objective-c.
Pour contraste entre et Ivar et une propriété, voir ce code:
MyInterface.h
@interface MyInterface : NSObject {
@private
NSFileManager * fileManager; // This is an instance variable, or 'ivar'
}
@property (retain) NSFileManager * fileManager; // This is the declaration of a property
MyInterface.m
@implementation MyInterface {
@synthesize fileManager;
// Calling this causes the Objective-C compiler to generate the following
// methods for you:
// -(NSFileManager *) getFileManager ...
// and - (void) setFileManager: (NSFileManager *) val ...
}
Pour utiliser la Ivar de votre classe, vous feriez faites simplement référence à son nom, dans votre exemple vous l'avez fait avec la ligne:
fileManager = [NSFileManager defaultManager];
Étant donné que l'instance libérée automatiquement renvoyée par la méthode que vous avez appelée n'est pas conservée, vous obtenez une exception EXEC_BAD_ACCESS plus tard dans votre programme. Pour utiliser la propriété que vous devez préfacer avec la référence d'objet possédant:
self.fileManager = [NSFileManager defaultManager];
Cela garantit que votre Ivar est réglé et conservé.
EDIT
Maintenant, pour apprécier vraiment la différence entre une variable d'instance et une propriété, vous pourriez avoir déclaré votre interface comme:
@interface MyInterface : NSObject {
@private
NSFileManager * _fileManager;
}
@property (retain) NSFileManager * fileManager;
Et dans votre .m vous aurait:
@synthesize fileManager = _fileManager.
Maintenant, lorsque vous avez essayé de faire fileManager = [NSFileManager defaultManager];
votre code ne compilerait pas, car il n'y a pas d'ivar appelé fileManager
dans votre classe. C'est un style de codage utile pour éviter les erreurs courantes.
Je signale que '-directoryContentsAtPath:' est obsolète, utilisez '- (NSArray *) contentsOfDirectoryAtPath: (NSString *) erreur de chemin: (NSError **) error' à la place. –