Целые числа, неправильно возвращенные из массива списка свойств (plist) в Objective-C - PullRequest
0 голосов
/ 07 апреля 2010

Таким образом, у меня возникла проблема, когда я прочитал то, что я ожидаю, что это NSNumber из NSArray, содержащегося в списке свойств, и вместо того, чтобы получить число, например '1', я получаю то, что выглядит как адрес памяти (то есть «61879840»). Числа четко указаны в списке свойств. Кто-нибудь знает, почему это может происходить и что я могу сделать, чтобы это исправить?

Ниже приведен мой процесс создания списка свойств и чтения его обратно.

Создание списка свойств

Я создал простой список свойств Objective C с массивами целых чисел в одном корневом массиве:

<array>
  <array>
    <integer>1</integer>
    <integer>2</integer>
  </array>
  <array>
    <integer>1</integer>
    <integer>2</integer>
    <integer>5</integer>
  </array>
  ... more arrays with integers ...
</array>

Массивы - это объекты NSArray, а целые числа - объекты NSNumber. Список свойств был создан и сериализован с использованием следующего кода:

// factorArray is an NSArray that contains NSArrays of NSNumbers as described above
// serialize and compress factorArray as a property list, Factors-bin.plist
NSString *error;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                        NSUserDomainMask, YES)
                      objectAtIndex:0];
NSString *plistPath = [rootPath stringByAppendingPathComponent:@"Factors-bin.plist"];
NSData *plistData = [NSPropertyListSerialization
                     dataFromPropertyList:factorArray
                     format:NSPropertyListBinaryFormat_v1_0
                     errorDescription:&error];

Проверяя созданный список, все значения и типы верны, что наводит меня на мысль, что я правильно создал список.

Чтение списка недвижимости

Список свойств читается как Данные, а затем преобразуется в NSArray:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Factors" ofType:@"plist"];
NSData *plistData = [[NSData alloc] initWithContentsOfFile:path];
NSPropertyListFormat format;
NSString *error = nil;
NSArray *factorData = (NSArray *)[NSPropertyListSerialization
                                  propertyListFromData:plistData
                                  mutabilityOption:NSPropertyListImmutable
                                  format:&format
                                  errorDescription:&error];

Циклически просматривая factorData, чтобы увидеть, что в нем содержится, я вижу ошибочные целые числа:

for (int i = 0; i < 10; i++) {
  NSArray *factorList = (NSArray *)[factorData objectAtIndex:i];
  NSLog(@"Factors of %d\n", i + 1);
  for (int j = 0; j < [factorList count]; j++) {
    NSLog(@"  %d\n", (NSNumber *)[factorList objectAtIndex:j]);
  }
}

Я вижу все правильное количество значений, но сами значения неверны, т.е.:

Factors of 3
  61879840 (should be 1)
  61961200 (should be 3)
Factors of 4
  61879840 (should be 1)
  61943472 (should be 2)
  61943632 (should be 4)
Factors of 5
  61879840 (should be 1)
  61943616 (should be 5)

1 Ответ

2 голосов
/ 07 апреля 2010

Попробуйте зарегистрировать intValue NSNumber вместо:

NSLog(@"  %d\n", [(NSNumber *)[factorList objectAtIndex:j] intValue]);
...