关于Stackoverflow的第一个问题。
让我先从一些代码开始。它有点重复,所以我要删除我为不同阵列重复的部分(随意询问其他部分)。但是,请优先忽略代码,以回答底部的Q.首先:感谢您提前回答问题。其次:释放数据。
@implementation ES1Renderer
GLfloat **helixVertices;
GLushort **helixIndices;
GLubyte **helixColors;
- (void)freeEverything
{
if (helixVertices != NULL)
{
for (int i=0; i < alphasToFree / 30 + 1; i++)
free(helixVertices[i]);
free(helixVertices);
}
if (helixIndices != NULL)
{
for (int i=0; i < alphasToFree / 30 + 1; i++)
free(helixIndices[i]);
free(helixIndices);
}
if (helixColors != NULL)
{
for (int i=0; i < alphasToFree / 30 + 1; i++)
free(helixColors[i]);
free(helixColors);
}
}
(我稍后会谈到这个问题)。现在我在哪里我malloc()数组。
- (void)askForVertexInformation
{
int nrows = self.helper.numberOfAtoms / 300;
int mrows = [self.helper.bonds count] / 300;
int alphaCarbonRows = [self.helper.alphaCarbons count] / 30;
helixVertices = malloc(alphaCarbonRows * sizeof(GLfloat *) + 1);
helixIndices = malloc(alphaCarbonRows * sizeof(GLfloat *) + 1);
helixColors = malloc(alphaCarbonRows * sizeof(GLfloat *) + 1);
for (int i=0; i < alphaCarbonRows + 1; i++)
{
helixVertices[i] = malloc(sizeof(helixVertices) * HELIX_VERTEX_COUNT * 3 * 33);
helixIndices[i] = malloc(sizeof(helixIndices) * HELIX_INDEX_COUNT * 2 * 3 * 33);
helixColors[i] = malloc(sizeof(helixColors) * HELIX_VERTEX_COUNT * 4 * 33);
}
[self.helper recolourVerticesInAtomRange:NSMakeRange(0, [self.helper.alphaCarbons count]) withColouringType:CMolColouringTypeCartoonBlue forMasterColorArray:helixColors forNumberOfVertices:HELIX_VERTEX_COUNT difference:30];
self.atomsToFree = self.helper.numberOfAtoms;
self.bondsToFree = [self.helper.bonds count];
self.alphasToFree = [self.helper.alphaCarbons count];
}
最后,调用所有内容的位(这是一个单独的类。)
- (void)loadPDB:(NSString *)pdbToLoad
{
if (!self.loading)
{
[self performSelectorOnMainThread:@selector(stopAnimation) withObject:nil waitUntilDone:YES];
[self.renderer freeEverything];
[renderer release];
ES1Renderer *newRenderer = [[ES1Renderer alloc] init];
renderer = [newRenderer retain];
[self performSelectorOnMainThread:@selector(stopAnimation) withObject:nil waitUntilDone:YES]; // need to stop the new renderer animating too!
[self.renderer setDelegate:self];
[self.renderer setupCamera];
self.renderer.pdb = nil;
[renderer resizeFromLayer:(CAEAGLLayer*)self.layer];
[newRenderer release];
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(setup:) object:pdbToLoad];
[self.queue addOperation:invocationOperation];
[invocationOperation release];
}
}
- (void)setup:(NSString *)pdbToLoad
{
self.loading = YES;
[helper release];
[renderer.helper release];
PDBHelper *aHelper = [[PDBHelper alloc] initWithContentsOfFile:pdbToLoad];
helper = [aHelper retain];
renderer.helper = [aHelper retain];
[aHelper release];
if (!resized)
{
[self.helper resizeVertices:11];
resized = YES;
}
self.renderer.helper = self.helper;
[self.helper setUpAtoms];
[self.helper setUpBonds];
if (self.helper.numberOfAtoms > 0)
[self.renderer askForVertexInformation];
else
{
// LOG ME PLEASE.
}
[self performSelectorOnMainThread:@selector(removeProgressBar) withObject:nil waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(startAnimation) withObject:nil waitUntilDone:YES];
self.renderer.pdb = pdbToLoad;
self.loading = NO;
}
我在这里做的是将PDB文件中的分子加载到内存中并在OpenGL视图窗口中显示它。第二次加载一个分子(上面会loadPDB:
运行)我得到了巨型三角综合症和相关效应......我会在我的分子上看到大三角形。
但是,每次加载新分子时,我都会释放并重新分配我的PDBHelper和ES1Renderer。因此我想知道:
1.我在这个实例中是否实际重用了我声明为类范围变量的helixVertices,helixIndices和helixColors。他们指向相同的对象吗?
2.我应该在释放后将所有变量设置为NULL吗?无论如何,我打算这样做,通过获得段错误来获取任何错误,但还没有完成整合它。
我甚至对malloc()一个类变量是否正确?有没有更好的方法来实现这一目标?我没有其他已知的方法将此信息提供给渲染器。
答案 0 :(得分:1)
我无法回答你的一般问题。那里有太多的东西。然而,这引起了我的注意:
[helper release];
[renderer.helper release];
PDBHelper *aHelper = [[PDBHelper alloc] initWithContentsOfFile:pdbToLoad];
helper = [aHelper retain];
renderer.helper = [aHelper retain];
[aHelper release];
我认为这些东西可能会泄漏。无论如何它都没有意义。
如果renderer.helper是保留或复制属性,请不要释放它。它已经具有在分配新值时释放旧值的代码。也不要保留分配给它的对象。
您已经分配了aHelper,因此无需再次保留它。上面的代码应该重写为:
[helper release];
helper = [[PDBHelper alloc] initWithContentsOfFile:pdbToLoad];
renderer.helper = helper;
另外,我认为你的helix malloced数组应该是实例变量。事实上,如果你有多个ES1Renderer,他们就会分享这些变量。