Ошибка iOS: «сообщение отправлено на незанятый экземпляр» при попытке изменить метку - PullRequest
0 голосов
/ 03 июля 2011

Итак, цель, которую я пытаюсь достичь, состоит в том, чтобы при нажатии на кнопку я хотел бы изменить текст метки. Пройдя несколько онлайн-уроков и попробовав множество альтернативных вариантов выделения / освобождения памяти, я все еще не могу обойти эту ошибку: *** - [HomeViewController executeSelector: withObject: withObject:]: сообщение отправлено в освобожденный экземпляр 0x4b4aa10

Вот мой код:

В моем приложении делегат:

   - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

        // Override point for customization after application launch.
        self.homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:[NSBundle mainBundle]];

        self.window.rootViewController = self.homeViewController;
        //[window addSubview:self.homeViewController.homeView];

        [self.window makeKeyAndVisible];

        return YES;
    }

- (void)dealloc {
    [homeViewController release];
    [window release];
    [super dealloc];
}

Тогда в моем HomeViewController.m:

@synthesize btnNewProject;
@synthesize btnOpenProject;
@synthesize label;

- (IBAction)newProject:(id)sender {
    NSString *text = @"We did it!";
    label.text = text;
    //[text release];
}

- (void)viewDidUnload {
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    //self.homeView = nil;
}

- (void)dealloc {
    [label release];
    [btnOpenProject release];
    [btnNewProject release];
    //[homeView release];
    [super dealloc];
}

Итак, событие запускается и вызывается newProject, но я не могу преодолеть это падение. Я попытался автоматически освободить контроллер и некоторые другие вещи. Есть ли явные ошибки?

Спасибо!

UPDATE:

Так что я использую IB. Я думаю, что я правильно настроил соединения от HomeViewController (класс которого я установил в пользовательском классе) до кнопок и надписи, а также действий с кнопками.

Одна важная деталь заключается в том, что у меня есть представление поверх контроллера представления (и оно связано с владельцем файла), а кнопки и метка находятся сверху представления в IB, но все соединения осуществляются через HomeViewController. - не уверен, что это должно иметь значение. На самом деле я нигде не устанавливаю представление в коде (т. Е. В делегате приложения, в котором установлен контроллер), но это переменная внутри HomeViewController, объявленная (без alloc), как и другие переменные (кнопки и метки):

@interface HomeViewController : UIViewController {
    HomeView *homeView;

    UIButton *btnNewProject;
    UIButton *btnOpenProject;
    UILabel *label;
}

@property (nonatomic, retain) HomeView *homeView;
@property (nonatomic, retain) IBOutlet UIButton *btnNewProject;
@property (nonatomic, retain) IBOutlet UIButton *btnOpenProject;
@property (nonatomic, retain) IBOutlet UILabel *label;

- (IBAction)openProject:(id)sender;
- (IBAction)newProject:(id)sender;

@end

Вот скриншот моих подключений: enter image description here

Хм ... собираюсь выбрать в распределении немного больше ...

Я загрузил проект здесь: http://devmu.com/transfer/NoteMap.zip

Ответы [ 3 ]

3 голосов
/ 03 июля 2011

Хорошо, я скачал и посмотрел ваш проект.Вы путаетесь с контроллерами представления, являющимися объектами в Интерфейсном Разработчике.На мой взгляд, в этой области отсутствует документация Apple.Для изучения этой части лучше воспользоваться книгой.

Объекты в Интерфейсном Разработчике - это реальные объекты, которые создаются, инициализируются и помещаются в ваши IBOutlet с при загрузке пера.У вас есть HomeViewController в вашем перо.Но вы также выделяете и инициализируете HomeViewController в коде вашего делегата приложения.Вам нужно только сделать одно или другое.

Я переместил представление из контроллера представления в Интерфейсном Разработчике и удалил контроллер представления из вашего пера.Как только я переименовал ваше перо в HomeViewController.xib (так как HomeView.h и HomeView.m кажутся остатками, а ваше перо соответствует HomeViewController, при нажатии кнопки появилось сообщение.

1 голос
/ 03 июля 2011

Попробуйте переменную окружения NSZombieEnabled, и вы найдете причину сбоя.

UPDATE

Да, если вы измените метод следующим образом self.homeViewController = [[[HomeViewController alloc] initWithNibName: @ "HomeView" bundle: nil] autorelease]; приложение не аварийно завершит работу и отобразит пустой белый вид. Кажется, вы создали перо каким-то другим способом. Что вам нужно сделать, это просто удалить контроллер представления из кончика. Должны быть простые View и ваши кнопки и привязать это представление к первому элементу в конструкторе интерфейсов, который называется владельцем файла. Я публикую скриншот для ясного понимания.

enter image description here

Я внес эти изменения, и приложение работает нормально.

1 голос
/ 03 июля 2011

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

Давайте удостоверимся, что у вас есть основы.

Примечание. Пользовательский класс объекта "Владелец файла"должен быть установлен в HomeViewController.Убедитесь, что это написано в пользовательском классе.

Control щелкните объект «HomeViewController» (владелец файла) и подключите выход btnNewProject к фактической кнопке;Теперь нажмите и удерживайте нажатой кнопку управления, чтобы подключить событие Touch Down к селектору newProject: из объекта HomeViewController.

Если вы сделаете это, все должно быть в порядке , используя указанный код.Если нет, то с вашим кодом или проектом что-то не так.Надеюсь, это поможет.

...