iPad应用程序崩溃异常

Posted

技术标签:

【中文标题】iPad应用程序崩溃异常【英文标题】:iPad app crashes with exception 【发布时间】:2013-12-01 14:52:49 【问题描述】:

我有一个用于编辑富文本的 iPad 应用程序...

它包含一个UITableView。我创建了EditorView,它继承了UITableViewCell

在那个EditorView 中,我添加UITextViewImageViewTableView

应用程序有时会崩溃并显示以下消息;

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ImageView layout]: unrecognised selector sent to instance 0x1886f650'

First throw call stack:

ARRAY : (
0   CoreFoundation                      0x30374e9b <redacted> + 154
1   libobjc.A.dylib                     0x3ab296c7 objc_exception_throw + 38
2   CoreFoundation                      0x303787b7 <redacted> + 202
3   CoreFoundation                      0x303770af <redacted> + 706
4   CoreFoundation                      0x302c5dc8 _CF_forwarding_prep_0 + 24
5   ZohoWriter                          0x000a916f -[EditorView layoutSubviews] + 1642
6   UIKit                               0x32af9353 <redacted> + 346
7   QuartzCore                          0x3277f943 <redacted> + 142
8   QuartzCore                          0x3277b167 <redacted> + 350
9   QuartzCore                          0x3277aff9 <redacted> + 16
10  QuartzCore                          0x3277aa0d <redacted> + 228
11  QuartzCore                          0x3277a81f <redacted> + 314
12  QuartzCore                          0x3277454d <redacted> + 56
13  CoreFoundation                      0x3033ff69 <redacted> + 20
14  CoreFoundation                      0x3033d8f7 <redacted> + 286
15  CoreFoundation                      0x3033dc43 <redacted> + 738
16  CoreFoundation                      0x302a8471 CFRunLoopRunSpecific + 524
17  CoreFoundation                      0x302a8253 CFRunLoopRunInMode + 106
18  GraphicsServices                    0x34fbc2eb GSEventRunModal + 138
19  UIKit                               0x32b5d845 UIApplicationMain + 1136
20  ZohoWriter                          0x0008d271 main + 116
21  libdyld.dylib                       0x3b022ab7 <redacted> + 2
)

我的代码是:

EditorView :

@interface EditorView : UITableViewCell

     NSString *mViewType;

     NSDictionary *mMargin;



@implementation EditorView

 - (id)initWithMargin:(NSDictionary *)margin withViewType:(NSString *)type withIndexPath:(NSArray *)indexPath
 
      self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"EDITOR_VIEW_ID"];
      if (self) 
          mUtils = [Utilities instance];
          mMargin = margin;
          _indexPath = indexPath;

          self.selectionStyle = UITableViewCellSelectionStyleNone;
          self.autoresizingMask = UIViewAutoresizingFlexibleHeight;
          mViewType = type;


          [self.contentView addSubview:/*  Here I'll add either Textview or Imageview or TableView*/];

          [self.contentView sizeToFit];

       
       return self;
 

 - (NSString *)viewType
 
     return mViewType;
 

 - (void)layoutSubviews

    [super layoutSubviews];

    CGRect bounds = self.contentView.frame;

    bounds.origin.x = [[mMargin objectForKey:@"left"] integerValue];
    if ([[_indexPath objectAtIndex:0] integerValue] == 1) 
        bounds.origin.y = [[mMargin objectForKey:@"top"] integerValue];
        bounds.size.height -= bounds.origin.y;
    
    bounds.size.width -= bounds.origin.x+[[mMargin objectForKey:@"right"] integerValue];
    self.contentView.frame = bounds;

    UIView *contentView = [self.subviews objectAtIndex:0];
    if ([mUtils is_ios7]) 
         contentView = [contentView.subviews objectAtIndex:0];
    

    UIView *subView = [contentView.subviews objectAtIndex:0];

    if ([mViewType isEqualToString:VIEW_TYPE_TEXT_VIEW]) 
        subView.frame = self.contentView.bounds;
     else if ([mViewType isEqualToString:VIEW_TYPE_TABLE_VIEW]) 
        bounds.origin = CGPointZero;
        subView.frame = bounds;
        [((TableView *)subView).layout invalidateLayout];
    
 

 @end

【问题讨论】:

您仔细阅读错误信息了吗? reason: '-[ImageView layout]: unrecognised selector sent to instance 0x1886f650 @Neeku:是的,我做到了。这是什么意思?我是IOS开发的新手。如果您详细说明问题的原因,将会很有帮助。 你检查了哪一行崩溃了吗?? @hussainShabbir:它在 [super layoutSubviews] 处崩溃 【参考方案1】:

由于您是 iOS 开发的新手,我将概括一下答案。

您看到该特定错误的原因有两个:

    您创建了一个对象实例并有意调用了一个您认为存在的方法,但事实并非如此。在这种情况下,您可以检查您的代码并查明该方法是否存在。例如,如果您打算在 ImageView 中对 UIView 进行子类化但没有这样做,则可能会发生这种情况。 您已经创建了一个对象实例并故意调用了一个您知道存在的方法,并且您已经确认它存在,但是您仍然收到了这个该死的错误消息。大多数情况下,它是由僵尸对象引起的;也就是说,在某些时候,您的对象已被解除分配,但您指向该对象的指针仍在使用中。您可以使用分析器找到这些。

为了进一步详细说明,我们需要查看 ImageView - 它似乎是一个自定义类。但在此之前,您可能需要在运行时调试并找出 ImageView 的值是什么,或者通过 profiler 运行应用程序并确保没有僵尸。

【讨论】:

【参考方案2】:

错误提示您正在调用 [ImageView 布局],但在此类 (ImageView) 中没有声明布局方法。您必须在 ImageView 类中声明布局方法,否则您必须删除该调用。

【讨论】:

【参考方案3】:

具体问题在这一行:

[((TableView *)subView).layout invalidateLayout];

您将subView 转换为TableView,但它实际上是ImageView。我的猜测是mViewType 不会返回您期望的值。

【讨论】:

以上是关于iPad应用程序崩溃异常的主要内容,如果未能解决你的问题,请参考以下文章

应用程序未在 ipad 中运行

(iOS) iPad 应用程序在启动时随机崩溃

iPad 应用程序在设备上崩溃

应用程序在 iPad 2 上运行良好,在 iPad 3 上崩溃,内存不足警告

应用程序在 iPad 中崩溃但在 iPad 模拟器中工作正常

iPad应用程序被拒绝,“未能及时启动”崩溃