Вызов внешнего метода класса вызывает Crash target-c - PullRequest
0 голосов
/ 27 марта 2011

У меня есть два класса, использующих Box2d, Cocos2d.
Construct.mm и Level1.mm
Construct содержит все методы для создания различных объектов в физическом движке box2d
Level1 содержит информацию о графикеобъектов.

В реализации конструкции у меня есть:
Construct.mm

-(void) someInitMethod{  
Level1 *level1 = [[Level1 alloc] init];  
[level1 mapping];  
}  
-(void) someCreateRectMethod:(argue)ments{  
//create rect  
}

В реализации уровня 1 у меня есть:

Level1.mm

-(void) mapping{  
Construct *constr;  
if (constr == nil) constr = [[Construct alloc] init];  
[constr someCreateRectMethod:(argue)ments];  
}

Теперь я знаю, что распределение Level1 * level1 работает нормально.Он переходит к - (void) mapping {}.
Моя проблема заключается в создании объекта Construct * constr и его инициализации.Без оператора if (constr == nil).Симулятор сразу же умрет, даже до публикации какого-либо сообщения об ошибке.
Если я поставлю if (constr == nil), а затем попробую вызвать [constr someCreateRectMethod: arguement];

Консоль сообщает:

* Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [Level1 someCreateRectMethod:]: нераспознанный селектор, отправленный экземпляру 0x5557fc0'

Я думаю, что это потому, что он не используется, поэтому пытается отправить себя (Level1), а не Construct.
Почему мой объект Construct * constr class не выделяет?Как я уже сказал, сообщений об ошибках не происходит .. Я импортировал файл Construct.h.Я потратил последние 4 часа, пытаясь заставить это работать.

РЕДАКТИРОВАТЬ

Я только что сделал слой 1 наследуемым от Construct.И вместо вызова [constr someCreateRectMethod];Я просто вызываю [super someCreateRectMethod];
Теоретически это должно работать, но симулятор падает, и отчеты об ошибках не регистрируются ..

Еще раз, спасибо за ваше время.
Оливер.

Ответы [ 2 ]

1 голос
/ 27 марта 2011

Вы, вероятно, не в конечном итоге создаете constr - начальное значение не определено и, следовательно, вряд ли будет равно нулю. Если ваш код заканчивается на [[constr alloc] init], то вполне вероятно, что вам не удалось создать подкласс NSObject (что вам нужно) и не реализовали init (что вам часто нужно).

0 голосов
/ 28 марта 2011

Хорошо, я обнаружил проблему, выполняется бесконечный цикл, когда я вызываю
[level1 mapping].Я добавил оператор NSLog в отображение метода Level1, чтобы консоль заполнилась NSLogs.

Этот бесконечный цикл создается только при попытке инициации объекта Construct * constr ...

Construct.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;
}

Level1.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  
...
...