возвращение NSObject - плохой exec - PullRequest
0 голосов
/ 02 февраля 2011

Я боролся с проблемой, с которой, я надеюсь, кто-то может мне помочь.

У меня есть класс с именем GameObjectDefinitionTable, где я устанавливаю все свои свойства объекта, который находится в другом классе, называемом «Product».».В моем «HelloWorldScene» я выделяю «GameObjectDefinitionTable», который, в свою очередь, создает несколько «Product».Например:

HelloWorldScene -> GameObjectDefinitionTable -> Product

Затем я хочу вернуть «Product» в «HelloWorldScene».Но здесь я получаю проблемы.Некоторый код:

HelloWorldScene:

GameObjectDefinitionTable *god = [[GameObjectDefinitionTable alloc]init];
Product* currentProduct = [god getProductWithNum:0];
NSLog(@"currenProduct (name): %@",currentProduct.name); //Crash

GameObjectDefinitionTable:

-(void) createProducts {
    Product *product;

    for (int i=0; i<[allProductsWithDefinitions count];i++ ) {  
        product = [[Product alloc]init];
        product.name = [[allProductsWithDefinitions objectAtIndex:i] objectAtIndex:0];
        product.density = [[[allProductsWithDefinitions objectAtIndex:i] objectAtIndex:1] floatValue];
        product.scoreValue = [[[allProductsWithDefinitions objectAtIndex:i] objectAtIndex:2] intValue];
        product.fileName = [[allProductsWithDefinitions objectAtIndex:i] objectAtIndex:3];
        [products addObject:product];   
        [product release];
    }

    [allProductsWithDefinitions release];
}

-(Product *) getProductWithNum:(int)tNum {
    Product *tempProduct;
    tempProduct = [products objectAtIndex:tNum];

    return tempProduct;
    [tempProduct release]; 
}

Массивы и все в 'GameObjectDefinitionTable'отлично работает, если я войду в этот класс.

Буду очень признателен за ответ :)

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Product *tempProduct;

tempProduct = [products objectAtIndex:tNum];

return tempProduct;

[tempProduct release];

Это то, что вы имеете в видуиметь?У вас вроде две большие проблемы, отменившие друг друга здесь.Линия [tempProduct release]; недоступна.Во-вторых, если бы вы на самом деле выполняли [tempProduct release]; перед возвратом, вы бы освободили память и затем получили доступ к свойству currentProduct.name того, что по существу является висящим указателем.Этот недопустимый доступ к памяти может привести к повреждению вашего Bad Exec.

Поскольку вы не выделяете, не копируете и не сохраняете tempProduct, вы НЕ ДОЛЖНЫ освобождать его.Почему бы не просто return [products objectAtIndex:tNum];?

1 голос
/ 02 февраля 2011

В таком случае вам нужно что-то вроде:

- (Product *)getProductWithNum:(int)tNum
{
  Product *tempProduct = [[products objectAtIndex:tNum] retain];
  return [tempProduct autorelease];
}
...