2012-05-04 4 views
1

В моем приложении у меня есть кнопка, которая является переменной экземпляра, объявленной в файле .h. Теперь, после выделения ему присвоение на цели к ней и фактически нажатием кнопки, происходит сбой приложения дает мне следующий вывод в отладчик:UIButton вызывающий селектор отключает приложение

-[__NSCFString handleActionSheet:]: unrecognized selector sent to instance 0x9090330 
2012-05-04 17:51:02.646 financeAppV2[2595:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString handleActionSheet:]: unrecognized selector sent to instance 0x9090330' 
*** First throw call stack: 
(0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x13d2e99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1b626 0x29dd 0x2945) 
terminate called throwing an exceptionCurrent language: auto; currently objective-c 

Мой код выглядит следующим образом:

saveButton=[UIButton buttonWithType:UIButtonTypeCustom]; 
[saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbutton"] forState:UIControlStateNormal]; 
[saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbuttonpressed"] forState:UIControlStateHighlighted]; 
saveButton.alpha=.8; 
saveButton.frame= frame; 
UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(0, 2, saveButton.frame.size.width, 21)]; 
[saveButton addSubview:label]; 

[saveButton addTarget:self action:@selector(handleActionSheet:) forControlEvents:UIControlEventTouchDown]; 

[self.view addSubview:saveButton]; 


-(void)handleActionSheet:(id)sender{ 
NSLog(@"working"); 

}

Любые идеи, почему приложение может сбой?

+0

Это происходит, если вы закомментируете '[saveButton addSubview: label];'? – Costique

+0

Да, да. На самом деле я даже получаю незнакомую ошибку: - [_ UITableViewSeparatorView handleActionSheet:]: нераспознанный селектор отправлен в экземпляр 0x6a89a30 2012-05-04 18: 12: 52.485 financeAppV2 [2997: f803] *** Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [_ UITableViewSeparatorView handleActionSheet]: непризнанные селектор направил к экземпляру 0x6a89a30' *** Первый стек бросить вызов: (0x13d1022 0x1562cd6 0x13d2cbd 0x1337ed0 0x1337cb2 0x13d2e99 0x1e14e 0x1e0e6 0xc4ade 0xc4fa7 0xc3d8a 0x2dfa1a 0x13a599e 0x133c640 0x13084c6 0x1307d84 0x1307c9b 0x12ba7d8 0x12ba88a 0x1 ... – iJatrat

ответ

5

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

Вы правильно установили свою кнопку (насколько я могу видеть) и наведите цель на self. К сожалению, к тому времени, как вы нажмете кнопку self, вышло за пределы области действия, и та же память используется NSString. iOS удивляется, когда вы отправляете строку сообщение handleActionSheet:.

+0

Что указывает на то, что 'self' не сохраняется должным образом? Может быть, еще пару вещей, верно? – mbm29414

+0

Спасибо Стивен! Я действительно узнал, что пошло не так с вашей стороны. Контроллер просмотра, в который была помещена моя кнопка, не является переменной экземпляра. Вот почему я думаю, что ARC выпустила его слишком рано. Я создал свойство для этого viewcontroller, а затем он сработал!Большое спасибо! – iJatrat

1

Вы отправляете сообщение с именем initAllIVars: в объект __NSCFString (вероятно, NSString).

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

+0

Я только что отредактировал сообщение и поместил в другой селектор, который будет вызываться. Однако появляется такое же сообщение об ошибке, но с обновленным селектором. Для меня также загадка, почему NSString получает сообщение отправлено, а не UIButton – iJatrat

+1

Всякий раз, когда объект внезапно «меняет типы», он обычно указывает, что вы перевыпускали этот объект, а память снова используется другим. Установите контрольную точку в свой код и проверьте адрес памяти 'saveButton' ** до того, как ** добавьте ее в' [self view] '. Затем проверьте, по крайней мере, это тот же адрес памяти, который выбрасывает исключение. Если это так, у вас есть ошибка памяти для отслеживания! – mbm29414

+0

Спасибо! Я проверю это. – iJatrat

0

Только что проверил ваш код, и он работает. Может быть, рама это не правильно установить

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    UIButton *saveButton = [[UIButton alloc] init]; 
    saveButton=[UIButton buttonWithType:UIButtonTypeCustom]; 
    [saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbutton"] forState:UIControlStateNormal]; 
    [saveButton setBackgroundImage:[UIImage imageNamed:@"intervalbuttonpressed"] forState:UIControlStateHighlighted]; 
    saveButton.alpha=.8; 
    saveButton.frame= CGRectMake(5, 5, 200, 40); 
    UILabel* label=[[UILabel alloc]initWithFrame:CGRectMake(0, 2, saveButton.frame.size.width, 21)]; 
    label.text = @"Hello"; 
    [saveButton addSubview:label]; 

    [saveButton addTarget:self action:@selector(handleActionSheet:) forControlEvents:UIControlEventTouchDown]; 

    [self.view addSubview:saveButton]; 

} 

-(void)handleActionSheet:(id)sender{ 
    NSLog(@"working"); 
} 
+0

Спасибо за ваш тест. Дело в том, что я переносил приложение в iPad и просто копировал код, который на самом деле работал на iPhone. Но внезапно он перестал работать. – iJatrat

+0

Невозможность установить фрейм не приведет к преждевременному освобождению объекта. –

Смежные вопросы