Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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崩溃_Objective C_Xcode_Class_Cocos2d Iphone_Box2d - Fatal编程技术网

调用外部类方法会导致objective-c崩溃

调用外部类方法会导致objective-c崩溃,objective-c,xcode,class,cocos2d-iphone,box2d,Objective C,Xcode,Class,Cocos2d Iphone,Box2d,我有两个类,使用Box2d和Cocos2d。 构造1.mm和1.mm标高 构造包含在box2d物理引擎中创建不同对象的所有方法 级别1包含有关对象打印的信息 在构造实现中,我有: 构造.mm -(void) someInitMethod{ Level1 *level1 = [[Level1 alloc] init]; [level1 mapping]; } -(void) someCreateRectMethod:(argue)ments{ //create rect }

我有两个类,使用Box2d和Cocos2d。
构造1.mm和1.mm标高
构造包含在box2d物理引擎中创建不同对象的所有方法
级别1包含有关对象打印的信息

在构造实现中,我有:
构造.mm

-(void) someInitMethod{  
Level1 *level1 = [[Level1 alloc] init];  
[level1 mapping];  
}  
-(void) someCreateRectMethod:(argue)ments{  
//create rect  
}
在1级实施中,我有:

标高1.mm

-(void) mapping{  
Construct *constr;  
if (constr == nil) constr = [[Construct alloc] init];  
[constr someCreateRectMethod:(argue)ments];  
}
现在,我知道Level1*Level1的分配工作正常。它跳转到-(void)映射{ }.
我的问题是创建Construct*constr对象并初始化它。没有if(constr==nil)语句。模拟器将立即死亡,甚至在发布任何错误报告之前。
如果我输入If(constr==nil),然后尝试调用[constr someCreateRectMethod:arguement]

控制台报告:

*由于未捕获异常而终止应用程序 “NSInvalidArgumentException”,原因: '-[Level1 someCreateRectMethod:]:无法识别 选择器已发送到实例0x5557fc0'

我认为这是因为它不是allocing,因此尝试发送到self(Level1)而不是构造。
为什么我的Construct*constr类对象不是allocing?就像我说的,没有错误报告它的发生。。我已导入Construct.h文件。我花了4个小时试着让它工作

编辑

我刚刚让第1层从构造继承。而不是调用[constr someCreateRectMethod];我只需调用[super-someCreateRectMethod]
这在理论上应该是可行的,但模拟器会崩溃,并且不会记录错误报告

再次感谢您抽出时间。

Oliver.

您可能不会最终创建constr-初始值未定义,因此不太可能为零。如果您的代码在[[constr alloc]init]处终止,那么很可能您没有将NSObject子类化(您应该这样做),而没有实现init(您通常希望这样做)。

好的,我发现了问题,当我调用
[level1映射]。我在Level1方法映射中添加了一条NSLog语句,以查看控制台中是否充满了NSLog

这个无限循环仅在我尝试初始化Construct*constr对象时创建

构造.mm

-(id) init
{
    if( (self=[super init])) {
        //ALLOCS
        _Eggs    = [[NSMutableArray alloc] init];
        _Block1s = [[NSMutableArray alloc] init];
        _Block2s = [[NSMutableArray alloc] init];

        //Begin Mapping of environment
        Level1 *level1 = [[[Level1 alloc] init] autorelease];
        [level1 mapping];
         }
   return self;
}
标高1.mm

@implementation Level1

-(void) mapping{

    NSLog (@"Mapping");
    Construct *constr = [[Construct alloc]init];
    return;
}

@end  
控制台:

2011-03-28 09:43:24.980 Construct[14661:207] Mapping  
2011-03-28 09:43:24.981 Construct[14661:207] Mapping  
2011-03-28 09:43:24.982 Construct[14661:207] Mapping  
2011-03-28 09:43:24.982 Construct[14661:207] Mapping  
2011-03-28 09:43:24.983 Construct[14661:207] Mapping  
2011-03-28 09:43:24.983 Construct[14661:207] Mapping  
2011-03-28 09:43:24.984 Construct[14661:207] Mapping  
2011-03-28 09:43:24.985 Construct[14661:207] Mapping  
2011-03-28 09:43:24.985 Construct[14661:207] Mapping  
2011-03-28 09:43:24.986 Construct[14661:207] Mapping  
2011-03-28 09:43:24.986 Construct[14661:207] Mapping  
...

cocos2d中的NSObject子类?是的。或者如果cocos中有更合适的子类,那么就将其子类化,因为它将是一个NSObject子类。但是,如果不将NSObject子类化,则不会有“init”的默认实现,也不会获得正常的init行为。包括您的接口文件。