2010-12-13 7 views
2

Je reçois un Program received signal: “EXC_BAD_ACCESS”. lorsque j'utilise le code suivant.Objectif-C - Signal reçu du programme: "EXC_BAD_ACCESS". avec (NSNumber floatValue)

searchResultFileSize est déclaré comme NSNumber dans mon interface. Je n'étais pas sûr de quelle propriété le définir. Actuellement, je l'ai comme:

@property (nonatomic, readonly) NSNumber *searchResultFileSize; 

Est-ce correct? Je reçois les erreurs sur les lignes suivantes:

NSLog(@"float filesize: %f", [searchResultFileSize floatValue]); //Program received signal: “EXC_BAD_ACCESS”. 
HUD.progress = [resourceLength floatValue]/[searchResultFileSize floatValue]; //Program received signal: “EXC_BAD_ACCESS”. 

Si je commente la première ligne, il échoue toujours sur la seconde. Des idées quel pourrait être le problème? Peut-être que mes conversions sont fausses. Voici les deux méthodes où je me sers de ce morceau de code:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 

    searchResultFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]]; 

    NSLog(@"Float filesize: %f", searchResultFileSize); 

    if ([searchResultFileSize intValue] != NSURLResponseUnknownLength) { 
     HUD.mode = MBProgressHUDModeDeterminate; 
     HUD.labelText = @"Getting Results"; 
    } 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 

    NSNumber *resourceLength = [NSNumber numberWithUnsignedInteger:[responseData length]]; 
    NSLog(@"resourceData length: %d", [resourceLength intValue]); 
    NSLog(@"filesize: %d", searchResultFileSize); 
    NSLog(@"float filesize: %f", [searchResultFileSize floatValue]); //Program received signal: “EXC_BAD_ACCESS”. 
    // HUD.progress is a float 
    HUD.progress = [resourceLength floatValue]/[searchResultFileSize floatValue]; //Program received signal: “EXC_BAD_ACCESS”. 
    NSLog(@"progress: %f", [resourceLength floatValue]/[searchResultFileSize floatValue]); 
} 

Répondre

4

Votre problème est ici:

searchResultFileSize = [NSNumber numberWithLongLong:[response expectedContentLength]]; 

Vous devez retain pour le garder autour, il est autoreleased.

searchResultFileSize = [[NSNumber numberWithLongLong:[response expectedContentLength]] retain]; 

je suggère la configuration de votre propriété comme (nonatomic, retain), alors vous n'aurez pas à retain dans votre code. De plus, vous devez utiliser les paramètres de propriété (self.searchResultFileSize = x;) par opposition à l'affectation directe. Ensuite, vous appelez release dans -dealloc.

En outre,

NSLog(@"Float filesize: %f", searchResultFileSize); 

searchResultFileSize est un objet NSNumber, vous pouvez produire la valeur d'un NSNumber en utilisant le spécificateur de format %@:

NSLog(@"Float filesize: %@", searchResultFileSize); 
+2

Ou, mieux encore: 'NSLog (@" filesize :% @ ", searchResultFileSize);' –

+0

..et que diriez-vous de faire la division sur HUD.progress? – fuzz

+0

Selon la reco de Jacob, il suffit de conserver NSNumber et tout ira bien. – Rog

Questions connexes