iPhone上出现奇怪的崩溃错误
Posted
技术标签:
【中文标题】iPhone上出现奇怪的崩溃错误【英文标题】:Weird crash error on iPhone 【发布时间】:2012-08-09 02:37:59 【问题描述】:我正在开发我的第一个 iPhone 应用程序,到目前为止它运行良好,但突然它开始崩溃并且我不断收到此错误:
2012-08-13 08:39:50.000 OGLGame[36085:10a03] -[NSCFString setFrame:]: 无法识别的选择器发送到实例 0x7368300 2012-08-13 08:39:50.031 OGLGame[36085:10a03] (0 CoreFoundation 0x0166203e __exceptionPreprocess + 206 1 libobjc.A.dylib 0x01c7fcd6 objc_exception_throw + 44 2 核心基础 0x01663cbd -[NSObject 不识别选择器:] + 253 3 CoreFoundation 0x015c8ed0 __转发 + 432 4 核心基础 0x015c8cb2 _CF_forwarding_prep_0 + 50 5 OGLGame 0x00004673 -[EAGLView setupScore] + 355 6 OGLGame 0x0000335b -[EAGLView initGame] + 299 7 OGLGame 0x00003217 -[EAGLView initWithCoder:] + 1047 8 UIKit 0x00a48135 -[UIClassSwapper initWithCoder:] + 243 9 UIKit 0x00b47c6e UINIbDecoderDecodeObjectForValue + 2276 10 UIKit 0x00b47383 -[UINibDecoder decodeObjectForKey:] + 117 11 UIKit 0x00a47cad -[UIRuntimeConnection initWithCoder:] + 187 12 UIKit 0x00b47c6e UINIbDecoderDecodeObjectForValue + 2276 13 UIKit 0x00b4767b UINIbDecoderDecodeObjectForValue + 753 14 UIKit 0x00b47383 -[UINibDecoder decodeObjectForKey:] + 117 15 UIKit 0x00a47105 -[UINib instantiateWithOwner:options:] + 817 16 UIKit 0x00a48eb7 -[NSBundle(UISBundleAdditions) loadNibNamed:owner:options:] + 157 17 UIKit 0x00825ce1 -[UIApplication _loadMainNibFileNamed:bundle:] + 58 18 UIKit 0x00825ff8 -[UIApplication _loadMainInterfaceFile] + 225 19 UIKit 0x0082517f -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 279 20 UIKit 0x00834183 -[UIApplication handleEvent:withNewEvent:] + 1027 21 UIKit 0x00834c38 -[UIApplication sendEvent:] + 68 22 UIKit 0x00828634 _UIApplicationHandleEvent + 8196 23 图形服务 0x03af7ef5 PurpleEventCallback + 1274 24 CoreFoundation 0x01636195 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 53 25 CoreFoundation 0x0159aff2 __CFRunLoopDoSource1 + 146 26 CoreFoundation 0x015998da __CFRunLoopRun + 2218 27 CoreFoundation 0x01598d84 CFRunLoopRunSpecific + 212 28 核心基础 0x01598c9b CFRunLoopRunInMode + 123 29 UIKit 0x00824c65 -[UIApplication_run] + 576 30 UIKit 0x00826626 UIApplicationMain + 1163 31 OGLGame 0x000029c4 主 + 116 32 OGLGame 0x00002945 开始 + 53 33 ??? 0x00000001 0x0 + 1)
这是我认为引发错误的函数:
-(void) setupScore
scoreLabel = [NSString stringWithFormat:@"foo"]; scoreLabel.frame = CGRectMake(262, 250, 100, 40); [scoreLabel setText: scoreString]; //normally you'll want a transparent background for your label scoreLabel.backgroundColor = [UIColor clearColor]; //you can use non-standard fonts [scoreLabel setFont:[UIFont fontWithName:@"TimesNewRoman" size: 1.0f]]; //change the label's text color scoreLabel.textColor = [UIColor whiteColor]; //you can even create a drop shadow on your label text /*myLabel.layer.shadowOpacity = 0.6; myLabel.layer.shadowRadius = 0.0; myLabel.layer.shadowColor = [UIColor blackColor].CGColor; myLabel.layer.shadowOffset = CGSizeMake(1.0, 1.0);*/ //add it to your view scoreLabel.transform = CGAffineTransformMakeRotation(89.53); [self addSubview:scoreLabel];
-(void) resetScore 分数 = 0; scoreLabel.textColor = [UIColor blackColor]; [分数标签发布];
-(void)drawScore [scoreLabel setText: scoreString];
有人知道如何解决这个奇怪的崩溃吗?
如果您需要更多代码,请告诉我,谢谢!
【问题讨论】:
问题是您的应用程序导致抛出异常,并且它没有捕获异常。您应该告诉调试器停止异常(Objective-C 和 C++,但这个是 Objective-C)并查看哪一行代码引发了异常。这就是你的错误所在。 抱歉,我是新手,我该怎么做? 请参阅 this page 了解如何打开它们。 所以我试了一下,它一直指向“int retVal”代码行,我不知道如何解决。 查看我对这个问题的回答以获得违规行的调用堆栈的 NSLog(然后在此处发布):***.com/questions/11462939/… 【参考方案1】:根据您发布的堆栈,很可能在 [EAGLView setupScore]
内有一个地方,您将变量分配为仅带有 alloc
的东西(可能是 NSString
),而不是分配返回它是 init
方法到同一个变量。
// this is WRONG!!
NSString *aString = [NSString alloc];
[aString initWithFormat:@"foo"];
// this is correct
NSString *aString = [[NSString alloc] initWithFormat:@"foo"];
// even better
NSString *aString = [NSString stringWithFormat:@"foo"];
// (class methods named in this manner (start with name of class)
// take care of alloc and init for you)
原因是 init 方法被允许返回一个与 alloc 返回完全不同的指针,并且这个新指针是有效的,旧的不是。 总是以这种方式嵌套你的 alloc/init 调用。
编辑
根据您在另一个答案的评论中发布的一些信息,看起来 -(void) setupScore
内的调用 [scoreLabel setText: scoreString];
正在通过 scoreString
使用不正确保留的 NSString 对象。
我的猜测是该字符串的@property 被声明为弱,否则您没有在任何地方正确初始化它。
编辑 2
您对 scoreLabel 和 scoreString 变量的处理不当。在一个地方,您将 scoreLabel 属性设置为 NSString。您可能打算这样做:
scoreString = [NSString stringWithFormat:@"foo"];
然后,您假设 scoreLabel
存在,但在您的其他方法之一中您明确释放它。这意味着您需要在此处检查它是否正确存在,并在需要时创建一个新的。
【讨论】:
我已编辑此答案以反映我认为基于该更新的情况。谢谢! 好的,所以我改变了它,但现在应用程序再次崩溃并出现另一个警告。 请使用相关代码(与该字符串相关的任何内容)和任何更新的错误更新您的问题。【参考方案2】:您的代码可能正在访问无效内存。当对象被释放并在之后使用时,这种情况经常发生。您可以打开僵尸检测来阻止这些情况。
【讨论】:
【参考方案3】:堆栈跟踪显示您正在使用自己的视图EAGLView
,它在初始化期间调用方法setupScore
。此处的第 340 行会导致崩溃。
这个方法怎么样?
【讨论】:
这类问题对原问题下的cmets区有好处。 -(void) setupScore scoreLabel = [[UILabel alloc] initWithFrame:CGRectMake(262, 250, 100, 40)]; [scoreLabel setText: scoreString]; //通常你会希望你的标签有一个透明的背景 scoreLabel.backgroundColor = [UIColor clearColor]; //可以使用非标准字体 [scoreLabel setFont:[UIFont fontWithName:@"TimesNewRoman" size: 1.0f]]; //改变标签的文本颜色 scoreLabel.textColor = [UIColor whiteColor]; //您甚至可以在标签文本上创建阴影 /*myLabel.layer.shadowOpacity = 0.6; myLabel.layer.shadowRadius = 0.0; myLabel.layer.shadowColor = [UIColor blackColor].CGColor; myLabel.layer.shadowOffset = CGSizeMake(1.0, 1.0);*/ //添加 scoreLabel.transform = CGAffineTransformMakeRotation(89.53); [self addSubview:scoreLabel]; 第 340 行是我设置得分方法结束后的空白行。以上是关于iPhone上出现奇怪的崩溃错误的主要内容,如果未能解决你的问题,请参考以下文章
针对 iPhone 3.0 操作系统编译时 UIActionSheets 出现奇怪错误
DequeueReusableCell 仅在 iPhone 4S 上崩溃应用程序