+1  A: 

I can't answer your general questions. There's too much stuff in there. However, this caught my eye:

[helper release];
[renderer.helper release];
PDBHelper *aHelper = [[PDBHelper alloc] initWithContentsOfFile:pdbToLoad];
helper = [aHelper retain];
renderer.helper = [aHelper retain];
[aHelper release];

I think this stuff possibly leaks. It doesn't make sense anyway.

If renderer.helper is a retain or copy property, do not release it. It already has code that releases old values when it is assigned new values. Also do not retain objects you assign to it.

You have alloc'd aHelper, so there's no need to retain it again. The above code should be rewritten something like:

[helper release];
helper = [[PDBHelper alloc] initWithContentsOfFile:pdbToLoad];
renderer.helper = helper;

Also, I think your helix malloced arrays should probably be instance variables. As things stand, if you have more than one ES1Renderer, they are sharing those variables.

JeremyP
Ah! They are sharing the variables. I just noticed the fact that they are called "class variables", and therefore shared by the class. (slow me). You have pretty much answered my main question, thanks!<p>As for the [retain]/[release] stuff, I thought I wasn't accessing the accessor method because I didn't put "self." in front of it, and therefore had to do the [retain] message myself. However, your code looks much tidier and I will adopt it - thank you :)
Helen
@Helen: `renderer.helper = helper` *is* using the accessor method. It's the same as `[renderer setHelper: helper]`. You need to use `self.` to access the object's *own* properties. i.e. `self.helper = foo` is the same as `[self setHelper: foo]`. In your code (and mine) we are setting the instance variable directly.
JeremyP
Thank you for the clarification! I should sleep more often.
Helen