EXC_BAD_ACCESS нераспознанный селектор отправлен на экземпляр - PullRequest
2 голосов
/ 29 июля 2010
//adds a button to scroll list  
-(void) addNode:(NSString *) atitle{  
     UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
     [btn setTitle:atitle forState:UIControlStateNormal];  
     [btn addTarget:self action:@selector(buttonTouched:)   forControlEvents:UIControlEventTouchUpInside]; // handle touch  
     [buttons addObject:btn];  
....
}

//a data button was pressed  
-(void) buttonTouched:(id)sender{  
   int index = [buttons indexOfObject:sender];  
   NSString *key = [sender titleLabel].text;  
}  

@interface MainViewController : UIViewController <FlipsideViewControllerDelegate>

-(id) init{  
    self = [super init];  
    ...  
}  

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.  
- (void)viewDidLoad {  
 [super viewDidLoad];  
 [[NSNotificationCenter defaultCenter] postNotificationName:@"ViewDidLoad" object:nil];  
}  

-(void) awakeFromNib{  
 [self loadData]; // loads some data  
  //calls addNode for a bunch of dynamic data
}  

Получение этой ошибки:

2010-07-29 10:19:45.428 DataManager[2945:207] -[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0  
2010-07-29 10:19:45.429 DataManager[2945:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString buttonTouched:]: unrecognized selector sent to instance 0x593abb0'  
*** Call stack at first throw:  
(  
 0   CoreFoundation                      0x02399919 __exceptionPreprocess + 185  
 1   libobjc.A.dylib                     0x024e75de objc_exception_throw + 47  
 2   CoreFoundation                      0x0239b42b -[NSObject(NSObject)   doesNotRecognizeSelector:] + 187  
 3   CoreFoundation                      0x0230b116 ___forwarding___ + 966  
 4   CoreFoundation                      0x0230acd2 _CF_forwarding_prep_0 + 50  
 5   UIKit                               0x002bde14 -[UIApplication  sendAction:to:from:forEvent:] + 119  
 6   UIKit                               0x003476c8 -[UIControl sendAction:to:forEvent:] + 67  
 7   UIKit                               0x00349b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527  
 8   UIKit                               0x003486f7 -[UIControl touchesEnded:withEvent:] + 458  
 9   UIKit                               0x00535070 _UIGestureRecognizerUpdateObserver + 3687  
 10  CoreFoundation                      0x0237ad1b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 27  
 11  CoreFoundation                      0x0230f987 __CFRunLoopDoObservers + 295  
 12  CoreFoundation                      0x022d8c17 __CFRunLoopRun + 1575  
 13  CoreFoundation                      0x022d8280 CFRunLoopRunSpecific + 208  
 14  CoreFoundation                      0x022d81a1 CFRunLoopRunInMode + 97  
 15  GraphicsServices                    0x02bfe2c8 GSEventRunModal + 217  
 16  GraphicsServices                    0x02bfe38d GSEventRun + 115  
 17  UIKit                               0x002cbb58 UIApplicationMain + 1160  
 18  DataManager                         0x00002940 main + 102  
 19  DataManager                         0x000028d1 start + 53  
)  
terminate called after throwing an instance of 'NSException'  
Program received signal:  “SIGABRT”.  
kill  
kill  

The Debugger has exited due to signal 15 (SIGTERM).The Debugger has exited due to signal 15 (SIGTERM). 

Ответы [ 3 ]

1 голос
/ 30 июля 2010

Я добавил [self retain]; до добавления действия к кнопке, и теперь оно работает!

-(void) addNode:(NSString *) atitle{  
UIButton *btn = [UIButton   buttonWithType:UIButtonTypeRoundedRect];  
    [btn setTitle:atitle forState:UIControlStateNormal];  
    [self retain];  
    [btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; // handle touch  

По какой-либо причине?
self - это UIViewController, который обрабатывает все (по крайней мере, ядумал)

1 голос
/ 13 августа 2013

Если вы используете компиляцию ARC и программно настраиваете селектор с помощью:

[_backButton addTarget:self action:@selector(btnPressed:) forControlEvents:UIControlEventTouchUpInside];

EXC_BAD_ACCESS происходит для меня, потому что я создал родителя, а затем добавил подпредставление в другое представление. У подпредставления (с кнопкой) была родительская версия. Все выглядело хорошо, пока кнопка не была выбрана, а затем сбой.

Любые исключения с селекторами, скорее всего, являются проблемами выпуска класса. Retain не следует использовать как обходной путь (конечно, в компиляциях ARC вы не можете использовать retain). Код должен быть проверен на наличие возможных овдовевших указателей в функции, которая освобождает родителя объекта.

Надеюсь, это поможет.

0 голосов
/ 29 июля 2010

Является ли buttons массивом, который вы инициализировали (я полагаю, поскольку вы используете addObject, который предназначен только для массивов)?Вы говорите, что он должен добавить его в список прокрутки (я предполагаю, что вы имели в виду представление прокрутки), но ошибка, которую вы выдаете, создает впечатление, что вы передаете его в строковый объект.

Чтобы добавитьдля просмотра с прокруткой вы должны сделать:

[someScrollview addSubview:btn];

Кроме того, я нигде не вижу, чтобы вы устанавливали рамку объекта, когда он добавляется в представление прокрутки.Это то, что вам нужно сделать перед добавлением его в качестве подпредставления.

Работает у меня просто отлично (обратите внимание, вы должны инициализировать и выпустить изменяемый массив где-то, я просто сделал это быстро):

Выход на консоль = 2010-07-29 15: 54: 54.563 Факел [52222: 207] Да Привет и 0

Код, который я использовал:

NSMutableArray *buttons; // in your .h interface

@property (nonatomic, retain) NSMutableArray *buttons; // in your .h

@synthesize buttons; // in your .m

(...)

-(IBAction) pushMyButtons {  
buttons = [[NSMutableArray alloc] init];

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
[btn setTitle:@"Hi" forState:UIControlStateNormal];  
[btn setFrame:CGRectMake(65, 300, 200, 23)];
[btn addTarget:self action:@selector(buttonTouched:)   forControlEvents:UIControlEventTouchUpInside]; // handle touch  
[buttons addObject:btn];
[self.view addSubview:btn];  
}

//a data button was pressed  
-(void) buttonTouched:(id)sender{  

int index = [buttons indexOfObject:sender];  
NSString *key = [sender titleLabel].text; 
NSLog(@"Yep %@ and %d", key, index);

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