我一直在努力解决一个我希望有人可以帮助我的问题。
我有一个名为'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'中的数组和所有数组都正常工作。
非常感谢答案:)
答案 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];
?