Objective-C Объявление объекта как совершенно другого класса, чем я объявил - PullRequest
0 голосов
/ 27 августа 2011

В методе, который я написал, я объявляю экземпляр класса 'A' и вызываю метод для него.Во время выполнения, когда метод работает, мое приложение вылетает.В нем говорится, что нераспознанный селектор был отправлен экземпляру класса «B», хотя я объявил экземпляр «A».Я где-то читал, что, возможно, не правильно управляю своей памятью, поэтому он отправляет метод другому классу, но я использую ARC, так что это не должно быть проблемой.Помощь будет принята с благодарностью!

The error I'm getting:
2011-08-27 01:25:49.859 Intelligenda[49385:bc03] PVC: <HomeViewController: 0x59359e0>
2011-08-27 01:25:49.945 Intelligenda[49385:bc03] -[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0
2011-08-27 01:25:49.947 Intelligenda[49385:bc03] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[HomeViewController addNewClass:]: unrecognized selector sent to instance 0x59359e0'

и вызываемый метод:

-(IBAction)done:(id)sender{

    [teacherName resignFirstResponder];
    [className resignFirstResponder];

    IntelligendaAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    UINavigationController *nav = delegate.navController;

    [nav popViewControllerAnimated:YES];

    ClassesViewController *classesParentViewController = (ClassesViewController *) nav.topViewController;

    ClassIG *theNewClass = [[ClassIG alloc] init];
    theNewClass.className = className.text;
    theNewClass.teacherName = teacherName.text;

    NSIndexPath *indexPath;


    theNewClass.subject = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;



    // add reminder to array
    NSLog(@"PVC: %@", [classesParentViewController description]);

    [classesParentViewController addNewClass:theNewClass];

}

Ответы [ 3 ]

1 голос
/ 27 августа 2011

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

Первые вещипроверить: если вы запускаете кнопки программно, то случайно ли вы добавили кнопку не в тот контроллер?Если вы разрабатываете все с использованием графического дизайнера интерфейса, но сохраняете его в одном NIB, возможно, вы скопировали и вставили кнопку и забыли изменить то, к чему она подключена?

Если вы можете получить несколькоконтроллеры навигации, вы уверены, что тот, который удерживается делегатом приложения, в данный момент находится на экране?

1 голос
/ 27 августа 2011

Объявление, скажем, указателя NSArray* fred ничего не делает (кроме разбрасывания предупреждающих сообщений во время компиляции), чтобы гарантировать, что fred является NSArray.Это то, что вы назначаете на fred, что имеет значение.Если вы назначите NSDateFormatter, то это то, что fred.

0 голосов
/ 27 августа 2011

короткий ответ таков: приведение типов и преобразование типов - это упражнение для программиста в objc.

прочитайте мой ответ здесь:

Передача NSNumber * в NSString * Ожидаемый параметрне вызывает предупреждение / ошибку компилятора

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

...