在xcode中为opengl模板生成的默认文件中出现意外内容

时间:2011-02-10 06:22:36

标签: objective-c xcode opengl-es

我刚刚在xcode中启动了一个新的opengl项目。当我浏览创建的默认文件时,我对viewController接口中的以下代码行感到困惑。

@interface RetinaTestViewController ()  
    @property (nonatomic, retain) EAGLContext *context;
    @property (nonatomic, assign) CADisplayLink *displayLink; 
    - (BOOL)loadShaders; 
    - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file; 
    - (BOOL)linkProgram:(GLuint)prog;  
    - (BOOL)validateProgram:(GLuint)prog; 
@end

我的问题是为什么这是在viewController的实现而不是在接口本身中编写的。这可能是非常基本的,但我刚开始使用openGL的东西。请帮忙。

1 个答案:

答案 0 :(得分:2)

我认为这不是真正与OpenGL相关的,但Objective-C有一些叫做类别的东西,它允许你为现有的类添加额外的方法。无论您是否拥有源代码,都可以将它们添加到您想要的任何类中。语法如下:

@interface classname (categoryName)
    - (void)extraMethod1;
    - (void)extraMethod2;
@end

@implementation classname (categoryName)

- (void)extraMethod1
{
}

- (void)extraMethod2
{
}

@end

而且,正如我所说,您可以使用它向任何类添加方法,包括例如NSString,NSDictionary和其他Foundation对象。

接口声明中的classname后面的括号表示这是一个类别,而不是完整的接口定义。从历史上看,没有办法通过类别向类添加额外的存储空间,因此您不能在类别中声明成员变量。因此,没有{}部分。

在现代运行时(在64位OS X和iOS上),您可以通过@properties添加额外的存储空间,就像Apple在您提供的代码中所做的那样。

这里Apple正在使用类别方法来创建类似私有方法的东西 - 在这种情况下,类中的每个人都知道的方法存在,但是没有在外部声明。这是一个设计决定,是为了保持其他人可能看得很整洁的位,并指出程序员的意图。

发生了什么:

  • Apple希望其他人知道的RetinaTestViewController的位在头文件中声明
  • 不打算暴露的位仅在实现文件
  • 中声明

设计良好的对象应该公开一个公共接口并符合该接口,同时在内部执行任何必要的操作并保持其内部机密。

您可以阅读更多类别方法hereherehere(向下滚动到第11位)。