Bienvenue sur le forum du blog iPhon.fr
Pensez à poster dans la bonne rubrique, respecter les propos des autres internautes, ne pas utiliser le langage SMS, et enfin, à utiliser la fonction 'Recherche' !
Et... Gardez le sens de l'humour, de la convivialité et de la décontraction. On n'est pas là pour se prendre la tête ! ;-)
Pages : 1
Bonjour,
J'ai récemment développé une application utilisant le gyroscope qui affiche les différentes rotations effectuées par l'iPhone.
Toutefois, lorsque je laisse tourner l'application elle freeze au bout de quelques minutes.
J'ai lancé Instruments pour voir s'il n'y avait pas de fuite, mais le problème semble venir de l'allocation. En effet, l'application alloue de manière croissante de la mémoire sans que celle ci se stabilise.
J'en conclue qu'il doit y avoir de la mémoire que je ne libère pas.
Voila les catégories qui explosent en terme de mémoire:
Graph Category Live Bytes # Living # Transitory Overall Bytes # Overall # Allocations (Net / Overall)
0 Malloc 32 Bytes 278,81 KB 8922 0 278,81 KB 8922 <XRRatioObject: 0x121102380> %1.00, %0.00
0 Malloc 16 Bytes 137,95 KB 8829 0 137,95 KB 8829 <XRRatioObject: 0x121107cb0> %0.99, %0.00
0 __NSArrayM 121,75 KB 3896 0 121,75 KB 3896 <XRRatioObject: 0x12110d630> %0.44, %0.00
0 __NSOperationInternal 546,47 KB 3886 0 546,47 KB 3886 <XRRatioObject: 0x121112f00> %0.44, %0.00
0 NSBlockOperation 121,44 KB 3886 0 121,44 KB 3886 <XRRatioObject: 0x128fe01f0> %0.44, %0.00
0 CMGyroData 60,72 KB 3886 0 60,72 KB 3886 <XRRatioObject: 0x128fd89e0> %0.44, %0.00
0 CMGyroDataInternal 60,72 KB 3886 0 60,72 KB 3886 <XRRatioObject: 0x120f96550> %0.44, %0.00
0 CMLogItemInternal 60,72 KB 3886 0 60,72 KB 3886 <XRRatioObject: 0x120f9bbe0> %0.44, %0.00
Est ce que quelqu'un aurait une idée ?
Merci
SW
Hors ligne
comme ca non, faudrait montrer du code
Hors ligne
-(void) update {
motionManager = [[CMMotionManager alloc] init];
[motionManager startDeviceMotionUpdates];
if (motionManager.gyroAvailable) {
motionManager.gyroUpdateInterval = 1.0/50; // 5Hz
[motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMGyroData *gyroData, NSError *error)
{
CMRotationRate rotate = gyroData.rotationRate;
CMAttitude* attitude;
CMDeviceMotion *motion = motionManager.deviceMotion;
attitude = motion.attitude;
gV.azimuth = [GyroView azimuthForGravity:accelerometerDelegate.gravity andHeading:locationDelegate.heading];
gV.height = [GyroView heightForGravity:accelerometerDelegate.gravity andHeading:locationDelegate.heading];
[gV updatePositionx:rotate.x y:rotate.y z:rotate.z r:attitude.roll p:attitude.pitch i:attitude.yaw height:gV.height azimuth:gV.azimuth];
}];
} else {
NSLog(@"No gyroscope on device.");
[motionManager release];
}
}
la méthode update est appelé au chargement de la vue géré par un délégate qui l'affiche.
La je pense qu'il y a un problème, je release le motionManager si il n'y a pas de gyroscope mais je ne le fait pas dans l'autre cas.
Je pense que le problème est là car lorsque je ne bouge pas l'iPhone, l'app est stable mais dès que je le bouge, tout s'emballe.
Hors ligne
alors la gestion de ton motionManager n'ets pas bonne, tu ne le release que quand il n'y a pas de gyro dispo.
Mets ton motionManager en property de ta classe plutot pour le reecreer à chaque update
Hors ligne
Je pense que tu voulais dire "plutôt que de l'initialiser à chaque fois"
Du coup quelque chose plus comme cela :
- (void)viewDidLoad {
//blabla
self.motionManager = [[CMMotionManager alloc] init];
//blala
}
-(void) update {
[self.motionManager startDeviceMotionUpdates];
if (self.motionManager.gyroAvailable) {
self.motionManager.gyroUpdateInterval = 1.0/50; // 5Hz
[self.motionManager startGyroUpdatesToQueue:[NSOperationQueue currentQueue]
withHandler: ^(CMGyroData *gyroData, NSError *error)
{
CMRotationRate rotate = gyroData.rotationRate;
CMAttitude* attitude;
CMDeviceMotion *motion = self.motionManager.deviceMotion;
attitude = motion.attitude;
gV.azimuth = [GyroView azimuthForGravity:accelerometerDelegate.gravity andHeading:locationDelegate.heading];
gV.height = [GyroView heightForGravity:accelerometerDelegate.gravity andHeading:locationDelegate.heading];
[gV updatePositionx:rotate.x y:rotate.y z:rotate.z r:attitude.roll p:attitude.pitch i:attitude.yaw height:gV.height azimuth:gV.azimuth];
}];
[self.motionManager release];
} else {
NSLog(@"No gyroscope on device.");
[self.motionManager release];
}
}
avec
@property (nonatomic, retain) CMMotionManager *motionManager;
dans le .h
Dernière modification par SilverWing (04-05-2011 12:50:30)
Hors ligne
oui, juste il faux déplacer le
[self.motionManager release];
juste dans le
viewDidUnload
sinon ton motionManager n'existe plus des que tu es passé une fois dans l'update.
Pour bien te mettre au point sur les bordels de mémoire en objc :
http://developer.apple.com/library/ios/ … yMgmt.html
ps: non, non je voulais bien dire créer un alloc init te crée bien ton object, avant il n'existe pas
Dernière modification par _pierre_ (05-05-2011 12:26:31)
Hors ligne
Pages : 1
L'iPhone sur iPhon.fr, le blog de l'iPhone - blog iPad
iPhon.fr et son forum ne sont pas liés à Apple, Orange, SFR ou autres et les marques citées sont la propriété de leurs détenteurs respectifs.