我们的构建系统在编译时使用gcc生成源文件对*.d文件的头依赖性:
gcc -MD -MF foo.d -c foo.o foo.cc
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何使用llvm clang生成类似的输出.
有没有办法获得当前正在运行的线程的任何类型的线程标识符,而无需求助于Objective-C的NSThread.
我正在改进我们的自定义调试跟踪系统,以正确处理多个线程.对于每行跟踪输出,我想打印一个线程ID或一个线程名称.线程以各种方式实例化,例如使用NSOperationQueue和pthread函数.
我目前有以下两种选择,但我对其中任何一种都不满意.还有其他选择吗?
pthread_t选项
pthread_t似乎是特定平台的typedef _opaque_pthread_h.现在可以使用字段_opaque_pthread_h,即使它是hack-y而且不可移植.它有一个__siglong类型的字段,但是对于我的进程的所有线程,它似乎具有相同的值.
NSThread选项
[NSThread name]需要NSAutoreleasePool在适当的位置,但我不希望这是一个要求,因为我们的大多数代码都是纯C++,所以在没有自动释放池包装的情况下启动c ++函数会很好.
有没有人知道或有很好的链接解释iPhone的事件循环在幕后做什么?
我们在基于OpenGL的iPhone游戏框架中使用自定义事件循环.它调用我们的游戏渲染系统,使用CFRunLoopRunInMode调用presentRenderbuffer和泵事件.有关详细信息,请参阅以下代码
当我们不使用UIKit控件(作为证明,尝试Facetap,我们的第一个发布的游戏)时,它运行良好.
但是,使用UIKit的控件时,一切都差不多的作品,但并不完全.具体来说,滚动UIKit控件无法正常工作.
例如,让我们考虑以下场景.
如上所述,一切都有效,滚动除外.
问题:滚动时,抬起手指后立即停止滚动.通常情况下,它会根据您的移动速度顺利进行,但不会在我们使用自定义事件循环时继续.似乎iPhone的事件循环正在做一些与我们自己没有实现的UIKit滚动相关的魔术.
现在,我们可以通过使用Apple的事件循环并通过NSTimer回调调用我们自己的渲染,让UIKit控件与我们自己的系统一起工作得很好.但是,我仍然想了解,在我们的自定义事件循环中未实现的iPhone事件循环中可能发生的事情.
- (void)customEventLoop { OBJC_METHOD;
float excess = 0.0f;
while(isRunning) {
animationInterval = 1.0f / openGLapp->ticks_per_second();
// Calculate the target time to be used in this run of loop
float wait = max(0.0, animationInterval - excess);
Systemtime target = Systemtime::now().after_seconds(wait);
Scope("event loop");
NSAutoreleasePool* pool = [[ NSAutoreleasePool alloc] init];
// Call our own render system and present render buffer
[self drawView]; …Run Code Online (Sandbox Code Playgroud) 我昨天遇到了以下奇怪的行为.这对我来说似乎是一个编译器错误,还是有一些我错过的东西?我使用Objective-C到C++适配器类将Facebook Connect for iPhone的Objective-C类包装起来,这样就可以更方便地使用我们自己的OpenGL/C++代码.
以下代码显示了该问题.在下面的第一个变体中,编译器编译但是弄乱了vtable,因此调用了错误的方法.在第二个变体中,我们得到一个编译器错误,表明gcc很混乱.
评论试图更详细地解释这种情况.
#include <iostream>
#import <Foundation/Foundation.h>
// An abstract C++ interface
class Foo_cpp {
public:
virtual void foo() = 0;
};
// Another abstract C++ interface
class Bar_cpp {
public:
virtual void bar() = 0;
};
// An Objective-C to C++ adaptor.
// It takes a C++ interface Foo. When it's do_foo method is called it
// delegates call to Foo::foo.
@interface Foo_objc : NSObject {
Foo_cpp* foo_cpp_;
}
@end
@implementation Foo_objc
- (id)init:(Foo_cpp*)foo {
self …Run Code Online (Sandbox Code Playgroud)