Сбой длины NSdata на устройстве - PullRequest
1 голос
/ 14 марта 2012

Во время выполнения этого кода:

NSData *archivedSavedData = [[NSData alloc] init];    
archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length] );

Я получаю эту ошибку (последняя строка) только при работе на подключенном устройстве:

[__NSCFArray length]: нераспознанный селектор отправлен на экземпляр 0x2398a0 2012-03-13 20: 25: 33.088 [7301: 707] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__ NSCFArray length]: нераспознанный селектор, отправленный экземпляру 0x2398a0' * Первый вызов стека вызовов: (0x34dbc88f 0x361e3259 0x34dbfa9b 0x34dbe915 0x34d19650 0xccb1b 0x31e13e33 0x31e38629 0x31dfcd7d 0x31ebf4dd 0x31e0555d 0x31e05579 0x31e0540b 0x31e053e7 0xcfedf 0x31e12e53 0x31e0c985 0x31ddac6b 0x31dda70f 0x31dda0e3 0x3600f22b 0x34d90523 0x34d904c5 0x34d8f313 0x34d124a5 0x34d1236d 0x31e0ba13 0x31e08e7d 0xcfd39 0xcbe28) прекратить называется бросить исключение

Этого не происходит при запуске на симуляторе или непосредственно на устройстве с профилем распространения (например, через testflight).

Кто-нибудь знает, как такое поведение могло произойти только в этом случае?

Спасибо.

ОБНОВЛЕНИЕ: при попытке заменить длину на количество я получаю следующую сложную ошибку: «Нет видимого @interface для« NSData »объявляет селектор« количество »»

UPDATE2: я понимаю, что это должен быть NSArray, а не NSData, но моя проблема заключается в том, что я сохранил архивированные NSData, поскольку мой массив состоит из пользовательских объектов, поэтому при сохранении в NSUserDefault мне пришлось архивировать эти данные в формате NSData. , Как еще я должен подходить к этому иначе?

Вот как я храню данные:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
   [defaults setObject:data forKey:@"listOfAccessNumbers"];  

массив - это массив пользовательских объектов вида:

@interface NumberDataObj : NSObject {

    NSString *inputName;
    NSString *inputNum;

}

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Сообщение об ошибке гласит:

-[__NSCFArray length]: unrecognized selector sent to instance

Это означает, что archivedSavedData является массивом и что он (очевидно) не отвечает на length, поэтому вы должны объявить archivedSavedData как массив и использовать вместо него count.

NSArray *archivedSavedData = [defaults objectForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData count]);

Теперь, что касается того, почему этого не происходит при работе на симуляторе, я предполагаю, что в ваших тестовых сценариях эта часть кода не вызывается.

EDIT

Если вы хотите получить данные как NSData, используйте метод dataForKey:

NSData *archivedSavedData = [defaults dataForKey:@"listOfAccessNumbers"];
NSLog(@"archivedSavedData length is %d", [archivedSavedData length]);

В документации написано для dataForKey:

Возвращаемое значение Объект данных, связанный с указанным ключом, или nil, если ключ не существует или его значение не является объектом NSData.

и для arrayForkey:

Возвращаемое значение Массив, связанный с указанным ключом, или nil, если ключ не существует или его значение не является объектом NSArray.

Поэтому всегда используйте соответствующий метод, когда вы знаете тип данных, чтобы избежать подобных проблем.

2 голосов
/ 14 марта 2012

Это потому, что [defaults objectForKey:@"listOfAccessNumbers"] возвращает NSArray, а не NSData объект.

2 голосов
/ 14 марта 2012

У вас две проблемы при написании кода:

1) Вы выделяете переменную с именем archivedSavedData, которую вы переназначаете в следующей строке без освобождения. Это нормально, если вы работаете с ARC, но первая строка будет ненужной.

2) Вторая проблема заключается в том, что объект, соответствующий ключу @ "listOfAccessNumbers", хранящемуся в вашем объекте по умолчанию, имеет тип NSArray. NSArray отвечает на количество селекторов, а не на длину. Возможно, вам стоит присмотреться к этому объекту и соответствующим образом перекодировать.

Надеюсь, это поможет:)

...