timeIntervalSinceDate:
Larme
Membre
Bonjour tout l'monde.
J'rencontre un p'tit soucis auquel je ne comprends vraiment rien...
Voici mon code :
J'ai un EXEC_BAD_ACCESS sur ma ligne avec le NSTimerInterval, qui m'oblige à redémarrer mon iPhone (ce fameux qLaunchSuccess)
<p>Dans le doc', y'a ça :
Il ne me semble pas avoir fait d'erreur, et pourtant, il y en aurait une...
J'rencontre un p'tit soucis auquel je ne comprends vraiment rien...
Voici mon code :
<br />
-([color=#cd00a5]IBAction[/color])PushShoot:([color=#cd00a5]id[/color])sender<br />
{[color=#008c00]<br />
//NSLog(@"Shoot");[/color][color=#3d8389]<br />
[color=#cd00a5] if[/color][color=#000000] (![/color]boolTime[color=#000000])[/color][/color]<br />
{<br />
[color=#3d8389] debut[/color] = [[color=#7c1fae]NSDate[/color] [color=#460085]date[/color]];[color=#e40000]<br />
[color=#460085] NSLog[/color][color=#000000]([/color]@"Debut : %@"[color=#000000], [/color][color=#3d8389]debut[/color][color=#000000]);[/color][/color][color=#3d8389]<br />
boolTime[color=#000000] =![/color]boolTime[color=#000000];[/color][/color]<br />
}[color=#cd00a5]<br />
else[/color]<br />
{<br />
[color=#3d8389] fin[/color] = [[color=#7c1fae]NSDate[/color] [color=#460085]date[/color]];[color=#e40000]<br />
[color=#460085] NSLog[/color][color=#000000]([/color]@"Fin : %@"[color=#000000], [/color][color=#3d8389]fin[/color][color=#000000]);[/color][/color][color=#460085]<br />
[color=#7c1fae] NSTimeInterval[/color][color=#000000] duree = [[/color][color=#3d8389]fin[/color][color=#000000] [/color]timeIntervalSinceDate[color=#000000]:[/color][color=#3d8389]debut[/color][color=#000000]];[/color][/color]<br />
}<br />
}<br />
J'ai un EXEC_BAD_ACCESS sur ma ligne avec le NSTimerInterval, qui m'oblige à redémarrer mon iPhone (ce fameux qLaunchSuccess)
<p>Dans le doc', y'a ça :
timeIntervalSinceDate:
Returns the interval between the receiver and another given date.
- (NSTimeInterval)timeIntervalSinceDate:(NSDate *)anotherDate
Parameters
anotherDate
The date with which to compare the receiver.
Return Value
The interval between the receiver and anotherDate. If the receiver is earlier than anotherDate, the return value is negative.
Availability
- Available in iOS 2.0 and later.
Il ne me semble pas avoir fait d'erreur, et pourtant, il y en aurait une...
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Si ce n'est pas le cas, il faut écrire:
(Et ne pas oublier le -release correspondant).
J'vais tester sur mon vrai projet.
Une petite explication quand à ce retain obligatoire, car je ne l'ai pas vu dans la doc.
[/color]
Ton objet debut est en autorelease. Elle est donc releasé la fin de la runloop. Donc à ton second appel de methode, tu appel un objet mort. Il faut donc le "maintenir en vie" en incrémentant son retainCount.
Tu vas donc avoir un retainCount à 2 jusqu'à la fin de la runloop, puis il passera à 1. tu pourras donc toujours l'utiliser.
Edit : et ça n'est pas dans la doc car ça n'est pas un principe que tu appliques uniquement à NSDate mais c'est un principe fondamental du memory management qui s'applique à toutes tes instances de classe.
Au lieu de faire un retain derrière en plus, vaux mieux directement faire [[NSDate alloc] init];
...une fois que tu as calculé "duree" histoire de faire les choses dans les règles de l'art. /wink.png' class='bbc_emoticon' alt=';)' />
Dans le dealloc ça peut se discuter de savoir si tu veux déclencher le KVO ou pas, si tu utilises du KVO et qu'en plus tu codes comme un porc ton KVO tu peux avoir des effets de bord oui, mais si tu codes propre, aucun souci.
que
Ou c'est exactement la même chose ?
Mouais, ça fait parti des grands débats qu'on peut trouver sur le net.. Perso je reste sur les conseils d'Apple, cà d éviter d'utiliser les getters/setters dans un init/dealloc. Sauf si réellement nécessaire. Dans le cas actuel je ne vois pas l'intérêt de déroger aux conseils d'Apple.
Par contre pour le init j'ai jamais vu de dépréciation d'utiliser des getter/setters dans le init ?! Tu tiens ça d'où ? Et je ne vois pas en quoi ça serait un problème en plus...
De toute façon on ne peut typiquement pas y échapper tout le temps dans le -init, surtout lorsqu'on sous-classe des objets de UIKit (exemple typique avec une UIScrollView qu'on veut configurer dès son instanciation)
Mais j'ai sûrement rêvé.. /biggrin.png' class='bbc_emoticon' alt=':D' /> Parce qu'effectivement je ne vois aucune raison valable.. Quand bien même je préfère appliquer le procédé suivant:
Bon comme je pense qu'Apple est suffisament intelligent dans son implémentation des NSObjects de CoreFoundation, je pense qu'ils ont fait du CoW sur les NSObjects, et donc que sur les objets immutable, retain et copy doivent être synonymes, mais bon, faut pas se baser sur cette assomption non plus !
Et ça veut dire aussi que si tu changes la policy de ta property dans le .h... faut que tu penses à changer dans le ou les "init" pour être cohérent ! Alors qu'avec l'accesseur, pas besoin. Et en plus avec l'accesseur c'est thread-safe (et KVO-compliant)
Comme je l'ai dit dans le dealloc je peux comprendre, ça a ses avantages et ses inconvénients, ça se discute, mais au moins je comprend pourquoi il y a débat.
Dans le init, je ne vois vraiment pas le problème.
Heu non.. j'ai pas écris la property là mais dans ma tête elle était décrite en "copy". C'est juste pour montrer que je n'utilise pas le setter.
Apparemment si
https://devforums.apple.com/message/668924
J'suis entièrement d'accord ^^