переменные экземпляра недоступны - PullRequest
0 голосов
/ 23 декабря 2010

Серьезная проблема здесь ... Я получаю ECX_BAD_ACCESS, если я пытаюсь NSLog переменную экземпляра моего пользовательского объекта.Следующая функция вызывается в моем ViewController, payload содержит строковые данные, которые извлекаются из URL.

- (void) initVcardWithData:(NSString *)payload {
  NSLog(@"1. initVcardWithData");
  aVCard = [[vcardItem alloc] initWithPayload:payload];
  VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard];
  [self presentModalViewController:aVCardViewController animated:YES];
  [aVCard release];
}

Пока все хорошо.Функция initWithWithVCard выглядит следующим образом: theVCard и theVCardN определены в @implementation и также установлены как @property (nonatomic, retain) в (.h).:

-(id)initWithVCard:(vcardItem *)aVCard {
  if(self = [super init]) {
      theVCard = [aVCard retain];
      theVCardN = [theVCard.PersonName retain];
  }

  NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName);
  return self;
}

Если я получаю доступtheVCardN объект в моем ViewController aVCardViewController в ViewDidLoad все работает как шарм.Я установил некоторые метки с данными из этого объекта.

Если я тогда попытаюсь получить доступ к переменным экземпляра из theVCardN внутри функции, которая вызывается из IBAction, подключенного к кнопке в View, я получаю ошибку EXC_BAD_ACCESS на консоли отладчика.Функция, которая пытается извлечь данные из переменных экземпляра, выглядит следующим образом:

-(IBAction)addressbookButtonTapped {
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]);
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]);
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);



//[self dismissModalViewControllerAnimated:YES];
}

RetainCounter для theVCardN прямо перед вызовом NSLog выводит "1".Затем строка NSLog возвращает EXC_BAD_ACCESS в консоли отладчика.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Не звоните -retainCount. Абсолютный счет удержания бесполезен.

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

Он бесполезен для отладки и представляет собой множество инструментов, специально предназначенных для отслеживания подобных проблем.

Во-первых, , если происходит сбой, есть обратный след . Отправьте это. Вероятно, не , что интересно в этом случае, но, тем не менее, всегда обращайте внимание на обратную трассировку, чтобы хотя бы подтвердить, что она терпит крах, где / как вы думаете.

Судя по опубликованным данным, похоже, что theVCardN.FirstName либо настроен на мусор, либо основная строка была перевыпущена. Включите режим обнаружения зомби и посмотрите, так ли это. Так как он падает на FirstName, покажите код, связанный с созданием / хранением FirstName.

Кроме того, переменные и методы экземпляра всегда должны начинаться со строчной буквы; PersonName должно быть personName & FirstName должно быть firstName.

0 голосов
/ 23 декабря 2010

Может быть, я неправильно читаю код или неправильно понимаю структуру вашего класса, но похоже, что вы регистрируетесь:

NSLog(@"Save to Adressbook: %@", theVCardN.FirstName);

Выше, где вы говорите, что все еще работает, вы регистрируетесь:

theVCard.PersonName.FirstName

Вам не хватает "PersonName"? Это означает, что вы должны войти:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);
...