作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图从类中获取 OpenGL ES native 窗口 (_win):
@interface CAEAGLLayer : CALayer <EAGLDrawable>
{
@private
struct _CAEAGLNativeWindow *_win;
}
所以我用类别扩展了它:
@interface CAEAGLLayer(MyLayer)
- (void*) fetchWin;
@end
@implementation CAEAGLLayer(MyLayer)
- (void*) fetchWin
{
return self->_win;
}
@end
并在另一个类中使用它:
@implementation MyClass
- (void)setupLayer
{
_eaglLayer = (CAEAGLLayer*)self.layer;
_eaglLayer.opaque = YES;
NSLog(@"_eaglLayer _win: %p", [_eaglLayer fetchWin]);
}
@end
但是在构建的时候,遇到了链接错误:
Undefined symbols for architecture x86_64:
"_OBJC_IVAR_$_CAEAGLLayer._win", referenced from:
-[CAEAGLLayer(MyLayer) fetchWin] in OpenGLView.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
最佳答案
链接器找不到符号,因为默认情况下,“@private
和 @package
ivars are not exported 的 ivar 符号。”所以你不能访问_win
以这种方式直接按名称,即使您有引用它的 header 。
但是,您可以深入了解 ObjC 运行时并提取实例变量。在你的情况下,你可以在你的 -setupLayer
中尝试这样的事情(在#importing <objc/objc-runtime.h>
之后):
Ivar winIvar = class_getInstanceVariable([CAEAGLLayer class], "_win");
void * winptr = (__bridge void *)object_getIvar(_eaglLayer, winIvar);
(您也可以在层上使用一个简单的 -valueForKey:
,使用 @"_win"
作为键的名称,但我更喜欢运行时方法,因为它们更清楚地说明您要做什么,这基本上绕过了预期的抽象。)
关于ios - 如何从 iOS 类 "CAEAGLLayer"获取 _CAEAGLNativeWindow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26706967/
我试图从类中获取 OpenGL ES native 窗口 (_win): @interface CAEAGLLayer : CALayer { @private struct _CAEAGLNa
我是一名优秀的程序员,十分优秀!