iOS: Comment supprimer un objet de la mémoire avec ARC activé?
Je développe une application iOS avec iOS 5 SDK, Automatique de Comptage de Référence est activée. Mais j'ai un objet spécifique qui est en cours de création en grand nombre et doit être libéré au bout d'une seconde, parce que sinon, l'appareil va devenir très lent. On dirait qu'ils ne sont pas libérés, car l'appareil est très lent. Est-il un moyen de valider manuellement un objet lorsque l'ARC est activé?
EDIT: Mon code, cela s'appelle de 200 fois par seconde pour générer des étincelles. Ils disparaissent après 0,8 secondes de sorte qu'ils sont inutiles ensuite.
int xanimationdiff = arc4random() % 30;
int yanimationdiff = arc4random() % 30;
if (arc4random()%2 == 0) {
xanimationdiff = xanimationdiff * -1;
}
if (arc4random()%2 == 0) {
yanimationdiff = yanimationdiff * -1;
}
Sparkle *newSparkle = [[Sparkle alloc] initWithFrame:CGRectMake(20 + arc4random() % 280, 20, 10, 10)];
//[newSparkle setTransform:CGAffineTransformMakeRotation(arc4random() * (M_PI * 360 /180))]; //Rotatie instellen (was niet mooi, net sneeuw)
[self.view addSubview:newSparkle];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.8];
[newSparkle setFrame:CGRectMake(newSparkle.frame.origin.x - xanimationdiff, newSparkle.frame.origin.y - yanimationdiff, newSparkle.frame.size.width, newSparkle.frame.size.height)];
newSparkle.alpha = 0;
[UIView commitAnimations];
L'éclat de l'objet code:
#import "Sparkle.h"
@implementation Sparkle
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"sparkle.png"]]];
}
return self;
}
@end
source d'informationauteur icant
Vous devez vous connecter pour publier un commentaire.
EDIT: Vous ne pouvez pas contrôler directement lorsqu'un objet est libéré, MAIS vous pouvez indirectement la cause qu'elle se produise. Comment? Rappelez-vous que l'ARC fait EXACTEMENT. À la différence de l'homme convention de codage, de l'ARC analyse votre code et insère la libération des déclarations DÈS QUE les OBJETS PEUVENT être libérés. Cela libère de la mémoire pour de nouvelles attributions tout de suite, ce qui est génial/nécessaire.
Sens, la définition d'un objet à néant, ou tout simplement en permettant une variable d'aller hors de portée ... quelque chose qui PROVOQUE UN 0 à CONSERVER COMPTER les forces de l'ARC à la place de sa sortie appels.
Il doit ... parce que ce serait une fuite autrement.
Juste entourent la section de code qui va être appelé à 200 fois avec un @autoreleasepool { ... } déclaration. Ce sera la cause de la mémoire pour être libéré immédiatement au lieu d'attendre pour le contrôle d'aller tout le chemin du retour de l'événement de la chaîne vers le haut niveau autorelease pool.
J'ai trouvé la réponse, c'était vraiment stupide. Je n'ai pas enlever les éclats de la superview. Maintenant, je les supprimer après 0,8 secondes avec une minuterie, et il effectue beaucoup de nouveau 🙂
Avec ARC vous ne peut pas appeler
dealloc
release
ouretain
mais vous pouvez toujours la conserver et de la libération CoreFoundation objets (NB: vous pouvez mettre en œuvredealloc
méthodes pour votre propre sous-classes, mais vous ne pouvez pas appelersuper dealloc
). Si la réponse est "non", vous ne peut malheureusement pas valider manuellement un objet lors de l'utilisation de l'ARC.J'avais de vérifier si vous êtes sûr qu'ils ne sont pas libérés, parce qu'en théorie, si vous ne font plus référence à un objet, il doit être libéré. Que faites-vous avec ces objets une fois que vous le créer? Il vous suffit de créer eux alors immédiatement détruire?
Vous pourriez peut-être poster le code que vous utilisez /les déclarations de propriété sont - ils
weak
oustrong
les objets référencés?