iPad应用程序崩溃异常
Posted
技术标签:
【中文标题】iPad应用程序崩溃异常【英文标题】:iPad app crashes with exception 【发布时间】:2013-12-01 14:52:49 【问题描述】:我有一个用于编辑富文本的 iPad 应用程序...
它包含一个UITableView
。我创建了EditorView
,它继承了UITableViewCell
。
在那个EditorView
中,我添加UITextView
或ImageView
或TableView
。
应用程序有时会崩溃并显示以下消息;
*** 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 2 上运行良好,在 iPad 3 上崩溃,内存不足警告