2017-01-11 15 views
0

Пожалуйста, смотрите код ниже:Коррупция NSString или проблемы кодирования в 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]; 
} 

Достопримечательности в splashAdvertiserURL. Когда я получаю эти данные и распечатываю их с помощью po, он выводится как «https://radar.com/ref/go/84/». Это прекрасно и что ожидалось. Когда я смотрю на входящие данные в JSONLint это выглядит следующим образом:

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

Как вы можете видеть, в дальнейшем я поставил NSString в одноточечного с свойством NSString. Здесь ничего ненормального. Затем я перехожу к нему, чтобы увидеть, что все в порядке. В дальнейшем программа продолжается. В другом классе я хочу получить эту информацию, и когда я попытаюсь сделать это, она выбрасывает EXC_BAD_ACCESS. Там, кажется, есть мусор.

Затем я помещаю в цикл код, который вы можете распечатать, по одному за раз. Очень странно, когда я печатаю, что с помощью ро я получаю:

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

Именно в этом формате!. Если я затем перейду к hardcode строке https://radar.com/ref/go/84/ - включая escape-символы и все, то все работает нормально. Нет проблем. Если я обрабатываю нормальную строку, входящую без escape-символов, она хранит штраф в одиночном тоне нет, введите код здесь

Я довольно преуменьшен здесь относительно того, что происходит. Может кто-нибудь помочь?

Спасибо

+0

Не должно быть 'character! = '!''? (одинарная цитата для сравнения 'char')? Если вы конвертируете 'objectNotation' в' NSString' ('alloc' /' initWithData: encoding: 'с UTF8), имеет ли он' \\ '? – Larme

+0

Извиняется, что код был удален - и почти не имеет значения. Я был занят игрой вокруг. – Zephyr

ответ

0

Для URL-адреса, который вы получили как строку, вам необходимо закодировать, прежде чем использовать его в своем приложении. Посмотрите на приведенный ниже код:

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

Благодарим вас за комментарий. Я попробовал это раньше и снова проверил. Тот же вопрос. Есть ли еще одна кодировка, которую мне нужно использовать? – Zephyr

+0

Пожалуйста, попробуйте читаемую строку URL-адреса, например 'NSString * sampleUrl = @" https://radar.com/ref/go/84/ ";' –