返回一个NSObject - 坏主持人

时间:2011-02-02 12:33:54

标签: xcode ios return nsobject

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

我有一个名为'GameObjectDefinitionTable'的类,我设置了所有的对象属性,这是在另一个名为'Product'的类中。在我的'HelloWorldScene'中,我分配'GameObjectDefinitionTable',后者又创建了几个'Product's。像这样:

HelloWorldScene - > GameObjectDefinitionTable - >产品

然后我想将'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 个答案:

答案 0 :(得分:1)

你是否需要这样的事情:

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

答案 1 :(得分:1)

  

Product *tempProduct;

     

tempProduct = [products objectAtIndex:tNum];

     

return tempProduct;

     

[tempProduct release];

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

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