2012-02-07 1 views
0

Ce code fonctionne, mais je suis fondamentalement maladroit autour de mon manque de connaissance en C. Le code fonctionne et semble être plus rapide que de créer NData instances chaque fois que je dois faire un appel de méthode. Mais est-ce correct (pas de fuite, pas de pointeur)?Utilisation de Byte * Au lieu de NSData: Mon code est-il correct?

Je suis particulièrement inquiet au sujet du casting de Byte* qui était nécessaire pour obtenir le compilateur de tuyau vers le bas:

Voici est le code simplifié:

- (BOOL) isThisMethodOkay { 
    // I have a length, range and an NSData instance 
    Byte bytes[self.data.length]; 
    [self.data getBytes:&bytes range:range]; 
    return [self doSomething:bytes length:length] 
} 

- (BOOL) whatAboutThis { 
    return [self doSomething:(Byte*)self.data.bytes length:self.data.length]; 
} 

- (BOOL) doSomething:(Byte*)bytes length:(NSUInteger)length { 
    return (length == CHECK_LENGTH && data1(bytes) == CHECK_DATA_1); 
} 

static int data1(Byte* bytes) { 
    int retVal = (int)bytes[1]; 
    return retVal; 
} 

Note: tout le code est sous ARC .

Répondre

1

Il n'y a pas de fuite de mémoire car bytes est un VLA qui utilise la pile. Si vous envisagez de traiter de grandes quantités de données, vous pouvez envisager d'allouer ces données sur le tas, puis de les libérer lorsque vous avez terminé. (Vous devez également être en mesure d'utiliser uint8_t au lieu de Byte)

- (BOOL) isThisMethodOkay { 
    // I have a length, range and an NSData instance 
    uint8_t *bytes = malloc(self.data.length); 
    [self.data getBytes:&bytes range:range]; 

    BOOL result = [self doSomething:bytes length:length]; 
    free(bytes); 
    return result; 
} 
+0

Merci! 1) que seraient les "grandes quantités"? Je ne vais probablement jamais dépasser 32 octets et 2) qu'en est-il de la seconde méthode, "WhatAboutThis"? –

+1

Si vous savez que vous ne dépasserez pas 32 octets, ça devrait aller. Il semble que le fil principal sur iOS soit limité à [taille de pile de 1 Mo] (http://stackoverflow.com/questions/2918691/is-there-stack-size-in-iphone). Qu'en est-il bien ainsi que tant que Byte est une forme de char (1 byte) – Joe

1

Ce code est correct car vous n'utilisez pas malloc qui alloue la mémoire dans le tas. Il n'y a pas de fuite que vous créez juste un tableau local Byte.

+0

Merci. Qu'en est-il de la distribution dans la méthode 'whatAboutThis'? –

+1

qui est également correct .. il n'y a pas de problème. –

+0

Merci et bonne chance sur SO. –

Questions connexes