Forum iPhone, iPad, Apple Watch de iPhon.fr

Forum utilisateurs Apple iPhone, iPad, Apple Watch, forfaits et accessoires

Vous n'êtes pas identifié(e).

Annonce

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 ! ;-)

#1 03-05-2011 10:01:55

SilverWing
Membre
Inscription : 20-04-2011
Messages : 7

Allocation & Gyroscope

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

#2 03-05-2011 11:27:45

_pierre_
Membre
Inscription : 24-01-2011
Messages : 17
Site Web

Re : Allocation & Gyroscope

comme ca non, faudrait montrer du code

Hors ligne

#3 03-05-2011 11:33:22

SilverWing
Membre
Inscription : 20-04-2011
Messages : 7

Re : Allocation & Gyroscope

  -(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

#4 04-05-2011 12:39:45

_pierre_
Membre
Inscription : 24-01-2011
Messages : 17
Site Web

Re : Allocation & Gyroscope

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

#5 04-05-2011 12:47:59

SilverWing
Membre
Inscription : 20-04-2011
Messages : 7

Re : Allocation & Gyroscope

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

#6 05-05-2011 12:24:53

_pierre_
Membre
Inscription : 24-01-2011
Messages : 17
Site Web

Re : Allocation & Gyroscope

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

Pied de page des forums

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.