NSString проблема для приложения iphone - PullRequest
0 голосов
/ 30 сентября 2010

Я использую NSDictionary, чтобы получить NSString из списка со следующим кодом:

NSString *fullPath = [[NSBundle mainBundle] pathForResource:@"TestIds" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary dictionaryWithContentsOfFile:fullPath] retain];
NSString *testid = [dictionary objectForKey:@"testId"];

и затем я сохраняю его в NSMutableArray с объектами класса, который я создал:

// before the code above
NSMutableArray *array = [[NSMutableArray array] retain]; // this is actually a global variable

// after the code
IdDescription *idDesc = [[IdDescription alloc] initWithId:testid];
[array addObject:idDesc];

приложение выполняет некоторые вещи с другими вещами, а затем вызывает метод, который вызывает NSString:

IdDescription *desc = [array objectAtIndex:n];
NSLog(@"%@", desc.testId); // testId is a property with retain

Проблема в том, что приложение аварийно завершает работу или прерывается, и все, что угодно, когда оно попадает в строку NSLog. Самое редкое, что это работает, если я меняю строку:

NSString *testid = [dictionary objectForKey:@"testId"];

для:

NSString *testid = @"testId_1";  // or any other string

Я тестировал добавление:

if ([testid compare:@"testId_1"] == NSOrderedSame)
    testid = @"testId_1";

после

 NSString *testid = [dictionary objectForKey:@"testId"]

и все еще работает.

Я также пытался использовать

NSString *testid = [NSString stringWithFormat:@"testId_%d", 1]

вместо тревожной линии, но она вылетает с той же ошибкой EXC_BAD_ACCESS.

Кто-нибудь знает, в чем может быть проблема? Я перепробовал почти все. Любая помощь наиболее ценится.

Ответы [ 4 ]

1 голос
/ 30 сентября 2010

Я нашел проблему. В соответствии NSString * testid = [словарь objectForKey: @ "testId"]; Я должен был изменить это на NSString * testid = [[словарь objectForKey: @ "testId"] copy]; поскольку объект NSData был освобожден после сбора всей информации.

0 голосов
/ 30 сентября 2010

Вы на самом деле не опубликовали достаточно информации, но есть вероятность, что либо desc является указателем мусора, либо desc.testId является указателем мусора к тому времени, как вы доберетесь до строки NSLog (). Обратите внимание, что если бы они были равны нулю, строка NSLog не потерпела бы крах, она просто напечатала бы

(null)

Две вещи, которые вы должны проверить.

  1. Вы сохраняете testId в методе init
  2. возвращаете ли вы себя в методе init.

Держу пари, что вы не сохраняете testId, поскольку, когда вы заменяете его константной строкой, проблема исчезает (release - это петля для константных строк).

0 голосов
/ 30 сентября 2010

Попробуйте включить зомби. Это сообщение означает, что используемый вами указатель на самом деле не является объективным объектом C. Скорее всего, потому что вы забыли сохранение или инициацию.

В информации для исполняемого файла добавить

NSZombieEnabled ДА

0 голосов
/ 30 сентября 2010
NSString *testid = [dictionary objectForKey:@"testId"];

Насколько вы уверены, что словарь содержит значение для ключа "testId"? Сделайте NSLog вашего словаря и проверьте его содержимое, чтобы убедиться, что все будет так, как вы ожидаете, к этому моменту.

Я не вижу ваш класс IdDescription, поэтому не могу видеть, где IdDescription хранит testid. Вы используете (nonatomic, retain) или подобное? Если это так, не забывайте, что вам нужно использовать self., когда вы делаете назначение, или retain не происходит.

EXC_BAD_ACCESS обычно, когда сообщение отправляется объекту, который был освобожден. Вы можете подтвердить это, установив NSZombieEnabled YES в настройках вашего исполняемого файла.

Вы также можете получить некоторую полезную информацию, если собираете с помощью статического анализатора shift-sommand-A. Лучше находить утечки, чем проблемы перевыпуска, но если вы добавите сохранение в IdDescription для testid и не получите извлечение из него, это еще одна информация, предполагающая, что testid был выпущен до того, как вы его закончили.

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