0

我一直在努力解决一个问题,希望有人可以帮助我。

我有一个名为“GameObjectDefinitionTable”的类,我在其中设置了所有对象属性,该属性位于另一个名为“Product”的类中。在我的“HelloWorldScene”中,我分配了“GameObjectDefinitionTable”,它又创建了几个“Product”。像这样:

HelloWorldScene -> GameObjectDefinitionTable -> 产品

然后我想将“产品”返回给“HelloWorldScene”。但这是我遇到问题的地方。一些代码:

你好世界场景:

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

游戏对象定义表:

-(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”中的数组和所有内容都可以正常工作。

非常感谢您的回答:)

4

2 回答 2

1

是不是你需要类似的东西:

- (Product *)getProductWithNum:(int)tNum
{
  Product *tempProduct = [[products objectAtIndex:tNum] retain];
  return [tempProduct autorelease];
}
于 2011-02-02T12:43:52.513 回答
1

Product *tempProduct;

tempProduct = [products objectAtIndex:tNum];

return tempProduct;

[tempProduct release];

这就是你的意思吗?你有两个大问题在这里相互抵消。[tempProduct release];线路无法到达。第二,如果您要[tempProduct release];在返回之前实际执行,您将释放内存,然后访问currentProduct.name本质上是一个悬空指针的属性。这种非法的内存访问可能会导致您的 Bad Exec。

由于您没有分配、复制或保留tempProduct,因此您不得释放它。为什么不只是一个简单的return [products objectAtIndex:tNum];?

于 2011-02-02T12:48:10.117 回答