2017-01-11 1 views
0

S'il vous plaît voir le code ci-dessous:corruption de NSString ou un problème de codage en Objective C

+ (void)splashDataFromJSON:(NSData *)objectNotation error:(NSError **)error 
{ 
    NSError *localError = nil; 
    NSDictionary *parsedObject = [NSJSONSerialization JSONObjectWithData:objectNotation options:0 error:&localError]; 

    if (localError != nil) { 
     *error = localError; 
    } 

    NSMutableArray* btms = [[NSMutableArray alloc] init]; 
    NSMutableDictionary* btmManufacturerResolutionDictionary = [[BTMCache sharedManager] btmManufacturerResolutionDictionary]; 

    NSArray *results = [parsedObject valueForKey:@"results"]; 
    NSLog(@"Count %d", parsedObject.count); 

    NSString* imageBaseUrl = [[parsedObject valueForKey:@"general"] valueForKey:@"image_base_url"]; 
    imageBaseUrl = [imageBaseUrl stringByAppendingString:@"hdpi/"]; 
    NSString* splashImageName = [[[parsedObject valueForKey:@"general"] valueForKey:@"splash"] valueForKey:@"img"]; 
    NSString* splashAdvertiserURL = [[[[parsedObject valueForKey:@"general"] valueForKey:@"splash"] valueForKey:@"url"] copy]; 

    NSMutableString* appendedString = [[NSMutableString alloc] init]; 
    for(int i =0 ;i<[splashAdvertiserURL length]; i++) { 
     char character = [splashAdvertiserURL characterAtIndex:i]; 
     printf(&character); 
     sleep(0.1); 
     if (character != "!") 
     { 
      [appendedString appendFormat:@"%c", character]; 
     } 
    } 

    [[SplashData sharedManager] setSplashAdvertiserURL:appendedString]; 
    [[SplashData sharedManager] setSplashImageName:splashImageName]; 

    splashAdvertiserURL = [[SplashData sharedManager] splashAdvertiserURL]; 
} 

Le point d'intérêt est splashAdvertiserURL. Quand je reçois ces données et les imprime en utilisant po, il sort comme "https://radar.com/ref/go/84/". C'est bien et ce qui était attendu. Quand je regarde les données entrantes dans JSONLint il ressemble à ceci:

"general": { 
     "image_base_url": "https:\/\/radar.com\/img\/manufacturers\/", 
     "splash": { 
      "img": "image1.png", 
      "url": "https:\/\/radar.com\/ref\/go\/84\/" 
     } 
    }, 

Comme vous pouvez le voir, plus loin, je mets le NSString dans un singleton avec une propriété NSString. Rien d'anormal ici. Je procède ensuite à la récupérer pour voir que tout va bien. En outre, le programme se poursuit. Dans une autre classe, je souhaite récupérer cette information, et quand j'essaye de le faire, elle lance EXC_BAD_ACCESS. Il semble y avoir des ordures là-dedans.

Je mets alors une boucle dans le code comme vous pouvez voir pour imprimer les caractères un à la fois. Très curieusement, quand j'imprimer à l'aide que je reçois po:

https: // r un d ar.com/ref/go/8 4/»

Exactement dans ce format!. Si je procède ensuite à coder en dur la chaîne https://radar.com/ref/go/84/ - y compris les caractères d'échappement et tout, alors tout fonctionne bien.Sans problème.Si je gère une chaîne normale entrante sans caractères d'échappement, il stocke bien dans le singleton aussi, pas de problème, entrez le code ici

Je suis assez perplexe ici à propos de ce qui se passe Est-ce que quelqu'un peut aider?

Merci

+0

Cela ne devrait-il pas être 'character! = '!''? (une seule citation pour comparer 'char')? Si vous convertissez 'objectNotation' en' NSString' ('alloc' /' initWithData: encoding: 'avec UTF8), at-il le' \\ '? – Larme

+0

Excuses, ce code a été supprimé - et à peu près hors de propos. J'étais occupé à jouer avec ça. – Zephyr

Répondre

0

Pour l'URL que vous avez reçue en tant que chaîne que vous devez encoder avant de l'utiliser dans votre application. Regardez le code ci-dessous:

NSString *sampleUrl = @"https:\/\/radar.com\/ref\/go\/84\/"; 
NSString *encodedUrl = [sampleUrl stringByAddingPercentEscapesUsingEncoding: 
NSUTF8StringEncoding]; 
+0

Merci pour le commentaire. J'ai déjà essayé cela et vérifié maintenant. Même problème. Y a-t-il peut-être un autre encodage à utiliser? – Zephyr

+0

Veuillez essayer une chaîne d'URL lisible par un humain comme 'NSString * sampleUrl = @" https://radar.com/ref/go/84/ ";' –