2012-06-30 3 views
0

У меня ошибка, которую я не понимаю.Почему мой делегат не получает этот селектор?

У меня есть класс, чтобы помочь с заданиями на печать:

//.h 

@interface PrintDelegate : NSObject <UIPrintInteractionControllerDelegate, UIAlertViewDelegate> 

@property (weak, nonatomic) FFDetailViewController* controller; 
@property (strong, nonatomic) NSMutableData* pdf; 
@property (assign) int   pageCount; 
@property (strong, nonatomic) NSArray*   fields; 
@property (weak, nonatomic) UIPrintInteractionController* printController; 

- (id) initWithPageCount:(int)pc forFields:(NSArray*)flds Controller:(FFDetailViewController*)ctlr; 
- (int) printFromButton: (UIBarButtonItem*) btn; 
- (void) makePDF; 
- (void) shift:(PixelShiftDirection)dir pixelCount:(int)amt; 
- (void) adjustFields; 
- (void) onPrintComplete; 

@end 

При завершении печати отобразить предупреждение, чтобы спросить, если пользователь хочет, чтобы настроить распечатку (и повторите печать).

//.m 
- (void) onPrintComplete 
{ 
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Printing Complete" message:@"Would you like to adjust the field positions?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Adjust", nil]; 

    [alert show]; 
} 

- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString* clickedButton = [alertView buttonTitleAtIndex:buttonIndex]; 

    if ([clickedButton isEqualToString:@"Adjust"]) 
    { 
     [self adjustFields]; 
    } 
} 

Когда я нажимаю любую кнопку в оповещении, я получаю сообщение об ошибке, похожее на это:

-[__NSArrayM alertView:clickedButtonAtIndex:]: unrecognized selector sent to instance 

Объект приема плохой селектор всегда что-то странное, (я также видел NSCFArrayM и __NSMallocBlock). Селектор - это метод из протокола UIAlertViewDelegate. Я не понимаю, почему селектор отправляется на какой-то неправильный объект, а не на объект PrintDelegae.

Благодаря

ответ

0

код вы вывесили выглядит нормально для меня (хотя UIAlertView может в конечном счете, утечка). Из вашего описания ошибок может случиться, что у вас есть некоторая кучность, потенциально вызванная выпуском указателя на один и тот же объект более одного раза.

0

Короткий ответ: вы, скорее всего, не сохраните PrintDelegate правильно. Более длинная версия - вы должны изучить жизненный цикл экземпляра PrintDelegate. Он должен жить достаточно долго, чтобы ручка вызывала обратный вызов ClickedButton. Вы можете попытаться установить точку останова в методе PrintDelegate-dealloc и посмотреть, когда и как его вызывают.

0

__NSArrayM - изменяемый массив. Либо вы передаете неправильный объект в качестве делегата, либо он освобождается, освобождается, перераспределяется и повторно инициализируется до вызова метода делегата. Поскольку вы также получаете NSCFArrayM, другой изменяемый массив и __NSMallocBlock, который я полагаю выделенным, но еще не инициализированным блоком памяти, я бы предложил второй. Проверьте управление памятью между созданием вида предупреждения и его увольнением. Вы можете попробовать инструменты анализа XCode и профилирования, они на удивление хороши.

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