Question

J'ai un objet créé par NSDate

NSDate *date = [[NSDate alloc] init];

Plus tard, je veux réinitialiser la date du « maintenant », donc je pensais que

[date init];

ou

date = [date init];

peut faire le travail, mais ils ne le font pas. Au lieu de cela,

[date release];
date = [[NSDate alloc] init];

fonctionne. Je suis un peu confus à ce sujet, étant donné que dans la documentation - (id) init, il dit:

  

Retourne un objet NSDate initialisé à la date et l'heure.

et depuis date est déjà attribué, il ne doit pas juste besoin d'un message init?

Était-ce utile?

La solution

Pensez à alloc et init moitiés comme logiquement inséparables d'un constructeur. Vous ne pouvez appeler des méthodes commençant par « init » une fois sur un objet donné - une fois que l'objet a été initialisé, et il est une erreur pour l'initialiser à nouveau. Cela est vrai pour tout objet Objective-C, non seulement NSDate. Cependant, les objets sont également NSDate immuable -. Une fois créé, ils ne peuvent pas changer

La raison fonctionne ce dernier code est parce que vous créez une nouvelle instance de NSDate, qui est la bonne chose à faire. Vous pouvez également utiliser [date NSDate] pour accomplir la même chose. Sachez qu'il retourne un objet que vous ne le faites pas (encore) propre, vous aurez donc besoin de le retenir si vous avez besoin de le garder autour, et relâchez plus tard.

Sachez que si vous recevez un objet de quelqu'un, il a déjà été initialisé. (Dans le cas contraire, il est une erreur de programmation dans le code qui a fourni, ou est une exception très rare à la règle.)

Autres conseils

Si vous voulez obtenir la date actuelle vous pouvez simplement utiliser:

NSDate * now = [NSDate date];

Si vous voulez garder retain il.

NSDate * now = [[NSDate date] retain];

Vous ne pouvez pas réinitialiser NSDate init, init est uniquement pour l'initialisation de l'objet pour la première fois.

Vous pouvez simplement obtenir une autre date:

NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];

Le message date retourne exemple autoreleased de NSDate, d'où le release ou autorelease.

Le autorelease est utilisé pour les cas où vous ne voulez pas à vous soucier de savoir où exactement vous devez libérer l'objet - il est mis en autorelease pool. Objet dans la piscine autorelease sont libérés après la fin de l'itération de boucle d'événements, ou lorsque vous appelez libération piscine ... (voir plus dans docs d'Apple sur la gestion de la mémoire).

BTW. la [NSDate date] est une méthode pratique, il est probablement quelque chose comme (non quaranteed être exactement le même, mais fonctionnellement similaire à):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top