我正在制作我的第一个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 CoreFoundation
0x01663cbd - [NSObject doesNotRecognizeSelector:] + 253 3
CoreFoundation 0x015c8ed0 __ 转发 + 432 4 CoreFoundation 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(UINSBundleAdditions) 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 GraphicsServices
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 CoreFoundation
0x01598c9b CFRunLoopRunInMode + 123 29 UIKit
0x00824c65 - [UIApplication _run] + 576 30 UIKit
0x00826626 UIApplicationMain + 1163 31 OGLGame
0x000029c4 main + 116 32 OGLGame
0x00002945 start + 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]; [scoreLabel发布]; }
- (无效)drawScore {
[scoreLabel setText:scoreString]; }
有谁知道如何解决这个奇怪的崩溃?
如果您需要更多代码,请告诉我们,谢谢!
答案 0 :(得分:1)
根据您发布的堆栈,[EAGLView setupScore]
内可能有一个位置,您要将变量指定为只有NSString
的内容(可能是alloc
),而不是将它的init
方法的返回值分配给同一个var。
// 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调用。
根据您在另一个答案的评论中发布的一些信息,看起来[scoreLabel setText: scoreString];
内的调用-(void) setupScore
正在通过scoreString
使用不正确保留的NSString对象。
我的猜测是该字符串的@property声明为弱,否则您无法在任何地方正确初始化它。
您对scoreLabel和scoreString变量进行了一些不正确的处理。在一个地方,您将scoreLabel属性设置为NSString。你可能打算这样做:
scoreString = [NSString stringWithFormat:@"foo"];
然后,您假设scoreLabel
存在,但在您的其他一种方法中,您明确地释放它。这意味着您需要在此处检查它是否正确存在,并在需要时创建一个新的。
答案 1 :(得分:0)
您的代码可能正在访问无效内存。当一个对象被释放并在之后使用时,这种情况会频繁发生。您可以打开僵尸检测以确定这些情况。
答案 2 :(得分:-1)
堆栈跟踪显示您正在使用自己的视图EAGLView
,该视图在初始化期间调用方法setupScore
。第340行导致崩溃。
此方法如何?