我刚刚在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的东西。请帮忙。
答案 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正在使用类别方法来创建类似私有方法的东西 - 在这种情况下,类中的每个人都知道的方法存在,但是没有在外部声明。这是一个设计决定,是为了保持其他人可能看得很整洁的位,并指出程序员的意图。
发生了什么:
设计良好的对象应该公开一个公共接口并符合该接口,同时在内部执行任何必要的操作并保持其内部机密。