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 对象。

谢谢

4

3 回答 3

0

简短的回答是您很可能没有PrintDelegate正确保留。较长的版本是您应该检查PrintDelegate实例的生命周期。它需要足够长的时间来处理 clickedButton 回调。PrintDelegate您可以尝试在'方法中设置断点,-dealloc然后查看何时以及如何调用它。

于 2012-06-30T02:14:54.813 回答
0

__NSArrayM是一个可变数组。要么您将错误的对象作为委托传递,要么在调用委托方法之前将其释放、解除分配、重新分配和重新初始化。由于您还得到NSCFArrayM另一个可变数组和__NSMallocBlock,我推断它是一个已分配但尚未初始化的内存块,我建议使用第二个。在创建警报视图和关闭它之间检查您的内存管理。您可能想尝试 XCode 分析和剖析工具,它们出奇的好。

于 2012-06-30T02:15:23.320 回答
0

您发布的代码对我来说看起来不错(尽管 UIAlertView 最终可能会泄漏)。根据您对错误的描述,可能是您有一些堆损坏,这可能是由于多次释放指向同一对象的指针而引起的。

于 2012-06-30T02:09:48.170 回答