Each object that should be drawn should conform to a certain protocol that would provide all the necessary information for one to be displayed. The render code would be contained inside a renderer class. For example:
@protocol Renderable <NSObject>
// returns a vertex array
-(GLfloat*)mesh;
@optional
-(GLKBaseEffect*)effect;
@end
@interface GLRenderer : NSObject
@property(nonatomic, strong) EAGLContext* context;
-(void)draw:(id<Renderable>)renderable;
@end
Drawing would be done inside the renderer class. So you'd simply call
[myRenderer draw:myCube];
In case(for some reason), you'd like to call the draw method on the cube itself, I suggest you keep the rendering code inside the renderer and simply handle rendering through inheritance by making a base drawable object for each of your objects. It would implement the Renderable protocol and implement the all the required methods.
I suggest you simply start by implementing the basic drawing operations and extend if needed. Try putting the generic code in the Renderer and object-specific code in objects, but provided through the Renderable protocol.
-(void)draw:(id<Renderable>)renderable{
if([renderable respondsToSelector:@selector(effect)]){
[[renderable effect] prepareToDraw];
}
GLFloat* data= [renderable mesh];
glBufferData(GL_ARRAY_BUFFER, sizeof(data),
data, GL_STATIC_DRAW);
// etc
}