Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Cocoa Touch-按下按钮时iPhone应用程序崩溃?_Objective C_Cocoa_Cocoa Touch_Debugging - Fatal编程技术网

Objective c Cocoa Touch-按下按钮时iPhone应用程序崩溃?

Objective c Cocoa Touch-按下按钮时iPhone应用程序崩溃?,objective-c,cocoa,cocoa-touch,debugging,Objective C,Cocoa,Cocoa Touch,Debugging,这是我的第一个应用程序。它不会使模拟器崩溃,它只会将您带回主屏幕。这不是我的第一个cocoa程序(我也不是cocoa专家),只是我的第一部iPhone 当您按下letsPlay按钮时,它会崩溃,该按钮运行-(iAction)letsPlay:(id)sender方法 救救我!出了什么事,我真是不知所措 H 阿帕德玛瑙酒店 #import <UIKit/UIKit.h> @class BrainiacViewController; @interface BrainiacAppDel

这是我的第一个应用程序。它不会使模拟器崩溃,它只会将您带回主屏幕。这不是我的第一个cocoa程序(我也不是cocoa专家),只是我的第一部iPhone

当您按下letsPlay按钮时,它会崩溃,该按钮运行
-(iAction)letsPlay:(id)sender方法

救救我!出了什么事,我真是不知所措

H

阿帕德玛瑙酒店

#import <UIKit/UIKit.h>

@class BrainiacViewController;

@interface BrainiacAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    BrainiacViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet BrainiacViewController *viewController;

@end
我又试了一次,检查了控制台,错误是……我不知道那是什么意思

[Session started at 2010-07-11 12:24:40 -0400.]
2010-07-11 12:24:45.729 Brainiac[46764:207] -[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00
2010-07-11 12:24:45.733 Brainiac[46764:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02395919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x024e35de objc_exception_throw + 47
    2   CoreFoundation                      0x0239742b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02307116 ___forwarding___ + 966
    4   CoreFoundation                      0x02306cd2 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x002b9e14 -[UIApplication sendAction:to:from:forEvent:] + 119
    6   UIKit                               0x003436c8 -[UIControl sendAction:to:forEvent:] + 67
    7   UIKit                               0x00345b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    8   UIKit                               0x003446f7 -[UIControl touchesEnded:withEvent:] + 458
    9   UIKit                               0x002dd2ff -[UIWindow _sendTouchesForEvent:] + 567
    10  UIKit                               0x002bf1ec -[UIApplication sendEvent:] + 447
    11  UIKit                               0x002c3ac4 _UIApplicationHandleEvent + 7495
    12  GraphicsServices                    0x02bfbafa PurpleEventCallback + 1578
    13  CoreFoundation                      0x02376dc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    14  CoreFoundation                      0x022d7737 __CFRunLoopDoSource1 + 215
    15  CoreFoundation                      0x022d49c3 __CFRunLoopRun + 979
    16  CoreFoundation                      0x022d4280 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x022d41a1 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x02bfa2c8 GSEventRunModal + 217
    19  GraphicsServices                    0x02bfa38d GSEventRun + 115
    20  UIKit                               0x002c7b58 UIApplicationMain + 1160
    21  Brainiac                            0x00002790 main + 102
    22  Brainiac                            0x00002721 start + 53
)
terminate called after throwing an instance of 'NSException'
2010-07-11 12:24:45.729 Brainiac[46764:207] -[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00

您需要在
NSNumber
对象中“装箱”整数
questionNumber
,如下所示:

theQuestion.text = [question objectForKey:[NSNumber numberWithInt:questionNumber]];
或者,您可以使用更合适的
NSArray
索引器:

theQuestion.text = [question objectAtIndex:questionNumber];
我又试了一次,检查了控制台,错误是……我不知道那是什么意思

[Session started at 2010-07-11 12:24:40 -0400.]
2010-07-11 12:24:45.729 Brainiac[46764:207] -[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00
2010-07-11 12:24:45.733 Brainiac[46764:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x02395919 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x024e35de objc_exception_throw + 47
    2   CoreFoundation                      0x0239742b -[NSObject(NSObject) doesNotRecognizeSelector:] + 187
    3   CoreFoundation                      0x02307116 ___forwarding___ + 966
    4   CoreFoundation                      0x02306cd2 _CF_forwarding_prep_0 + 50
    5   UIKit                               0x002b9e14 -[UIApplication sendAction:to:from:forEvent:] + 119
    6   UIKit                               0x003436c8 -[UIControl sendAction:to:forEvent:] + 67
    7   UIKit                               0x00345b4a -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527
    8   UIKit                               0x003446f7 -[UIControl touchesEnded:withEvent:] + 458
    9   UIKit                               0x002dd2ff -[UIWindow _sendTouchesForEvent:] + 567
    10  UIKit                               0x002bf1ec -[UIApplication sendEvent:] + 447
    11  UIKit                               0x002c3ac4 _UIApplicationHandleEvent + 7495
    12  GraphicsServices                    0x02bfbafa PurpleEventCallback + 1578
    13  CoreFoundation                      0x02376dc4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    14  CoreFoundation                      0x022d7737 __CFRunLoopDoSource1 + 215
    15  CoreFoundation                      0x022d49c3 __CFRunLoopRun + 979
    16  CoreFoundation                      0x022d4280 CFRunLoopRunSpecific + 208
    17  CoreFoundation                      0x022d41a1 CFRunLoopRunInMode + 97
    18  GraphicsServices                    0x02bfa2c8 GSEventRunModal + 217
    19  GraphicsServices                    0x02bfa38d GSEventRun + 115
    20  UIKit                               0x002c7b58 UIApplicationMain + 1160
    21  Brainiac                            0x00002790 main + 102
    22  Brainiac                            0x00002721 start + 53
)
terminate called after throwing an instance of 'NSException'
2010-07-11 12:24:45.729 Brainiac[46764:207] -[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00
您将消息(
letsPlay:
)发送到一个不响应该消息的对象(NSString,此处显示为NSCFString)

这种情况经常发生,因为您没有正确地保留要发送给的对象,所以它被释放了。后来在同一个地址分配了一个NSString,所以所有曾经持有指向旧对象指针的对象(并且认为它仍然是)现在都持有指向NSString的指针。相同的指针,不同的对象。然后,当其中一个潜在的所有者试图将信息发送给它认为它仍然拥有的对象时……砰

解决方法是检查您的所有权,确保您保留(或使用
alloc
创建,而不是自动删除)您想要拥有的内容

另一方面:

如果您想让它成为局部变量,则必须在方法结束时释放它,否则将泄漏此数组

如果要拥有此对象,则应将其移动到实例变量,并删除局部变量,然后像现在一样继续创建对象


必需阅读:.

我再次检查了控制台,发现有一个错误。我编辑了我的帖子并添加了错误,以防有帮助。不要这样做平行收集(
问题
正确答案
错误一个
错误三个
)。Cocoa和Cocoa Touch是面向对象的框架;编写相应的应用程序。您应该有一个问题对象的集合,可能是一个数组,每个对象都应该有一个答案数组,每个答案都有其是否正确的属性,其中一个(每个问题)的属性设置为
YES
。这样就可以很容易地问一个随机的问题,随机排列答案,并测试用户选择的答案是否正确(你只需问答案是否正确)。我丢失了letsPLay方法分配的内存,所以它无法运行,然后在不需要的时候重新分配了它?我该如何解决这个问题???是的,我知道我需要释放我的内存。我仍然在编写代码,我知道我需要释放它,但被这个错误分散了注意力!谢谢你的阅读链接,我会查出来的。首先,我想解决这个例外,我如何检查我的所有权,而不是自动释放?letsplay方法没有任何这些。。对不起,我对cocoa不熟悉..没有“letsPlay方法的已分配内存”。解除分配的对象是您试图向其发送
letsPlay:
消息的对象。自动释放不是坏事;当您不想再拥有它时,您只需要确保释放您所拥有的内容(无论是通过
release
还是通过
autorelease
),并且不要跳过文档。无论是现在还是将来,它都将为您提供解决此问题所需的理解。不先阅读文档是在浪费时间。内存管理的具体方式非常明确。
2010-07-11 12:24:45.729 Brainiac[46764:207] -[NSCFString letsPlay:]: unrecognized selector sent to instance 0x5944f00
NSMutableArray *possibleAnswers = [[NSMutableArray alloc] init];
[possibleAnswers addObject:[rightAnswer objectForKey:questionNumber] ];
[possibleAnswers addObject:[wrongOne objectForKey:questionNumber] ];
[possibleAnswers addObject:[wrongTwo objectForKey:questionNumber] ];
[possibleAnswers addObject:[wrongThree objectForKey:questionNumber] ];