我正在读一篇关于iPhone编程的帖子,我注意到关于Objective C++的讨论,帖子中显示的代码看起来主要像Objective-C,但C++中也有几个片段.是否真的可以用C++编写Cocoa?
我正在将Objective-C部件混合到一个C++项目中(请不要争论它,它的跨平台).
我现在想在cocoa环境中的正确线程(即主线程)上调用一些C++函数或方法.
我目前的方法是将函数指针传递给objective-c实例(派生自NSObject)和do performSelector/ performSelectorOnMainThreadon.
但是performSelectors期望对象作为他们的参数,那么通常如何包装它?
例:
typedef void(*FnPtr)(void*);
FnPtr fn;
[someInstance performSelector:@selector(test:) withObject:fn];
Run Code Online (Sandbox Code Playgroud)
...测试被声明为:
- (void)test:(FnPtr)fn;
Run Code Online (Sandbox Code Playgroud)
不得不补充一点,我本周才开始使用objective-c,所以如果有更好的方法,我也很高兴听到它.
另请注意,我无法访问主循环或任何应用程序对象,因为该项目是一个浏览器插件(目前仅在mac上定位Safari).
我有一个项目必须设置为"Objective-C++"的"编译源为"值(不,"根据文件类型"将不能在我的主项目中工作).我遇到的问题是我从一个框架(特别是OpenFeint)获得的文件,当编译为"Objective-C++"时会出现编译错误.
error: pointer of type 'void *' used in arithmetic
Run Code Online (Sandbox Code Playgroud)
我可以在一个测试项目中编译该文件,该项目设置为"根据文件类型"为"编译源为"值.所以我想知道如何设置一个特定的文件来编译为Objective-C?如果我可以在我的实际项目中将这个文件编译为Objective-C,那么一切都应该完美和谐地工作.
任何帮助表示赞赏.
谢谢!
我刚刚将我的代码从Objective-C切换到Objective-C++.除了两条线外,一切都在游动.
NSString * text1=[[NSString stringWithFormat:@"%.2f",ymax] UTF8String];
Run Code Online (Sandbox Code Playgroud)
这条线抱怨说
error: cannot convert 'const char*' to 'NSString*' in initialization
Run Code Online (Sandbox Code Playgroud)
与第一个相关的第二个错误来自以下行:
CGContextShowTextAtPoint(context, 2, 8, text1, strlen(text1));
Run Code Online (Sandbox Code Playgroud)
它抱怨说
error: cannot convert 'NSString*' to 'const char*' for argument '1' to 'size_t strlen(const char*)'
Run Code Online (Sandbox Code Playgroud)
ObjC和ObjC++之间的区别是否有一些错过的东西?
我有一个项目,我主要使用两个构建设置.不幸的是今天出了问题.一个编译而另一个没编译.如何比较XCode中的两个构建设置以查看差异是什么?
(对于那些感兴趣的人,我在一个版本中得到的错误是
jump to case label crosses initialization of 'const char* selectorName'
Run Code Online (Sandbox Code Playgroud)
如果你知道这意味着什么,我将非常感激)
我正在尝试将一些C++代码移植到Objective-C.它包括iostream和sstream,但Objective-C不承认这些.应该做什么?
我试图通过Objective-C++中的异步调度队列来执行一个块.这是我正在尝试做的一个类片段......
class Blah {
public:
void dispatch(const EventPtr& event) {
dispatch_queue_t queue = dispatch_queue_create(_queueName.c_str(), NULL);
dispatch_async(queue, ^{
this->dispatchEventToSubscribers(event);
});
dispatch_release(queue);
}
protected:
Dude _dude;
void dispatchEventToSubscribers(const EventPtr& event) {
_dude.dispatchToSubscribers(event);
}
}
Run Code Online (Sandbox Code Playgroud)
我在dispatchEventToSubscribers方法中获得了EXC_BAD_ACCESS.当我检查是什么值时_dude,XCode告诉我它超出了范围.我只能假设我在this某种程度上失败了.检查并发文档:
对于计划使用调度队列异步执行的块,可以安全地从父函数或方法捕获标量变量,并在块中使用它们.但是,您不应尝试捕获由调用上下文分配和删除的大型结构或其他基于指针的变量.在块执行时,该指针引用的内存可能会消失.当然,自己分配内存(或对象)并明确地将该内存的所有权移交给块是安全的.
那么如何在this对象上异步调度方法呢?
谢谢!
concurrency objective-c++ grand-central-dispatch objective-c-blocks
我使用cocos2d(iOS)和box2d来创建游戏.
我已经到了需要更改接触过滤器中间模拟的地步,并想知道如何解决这个问题.
我需要使用maskbits和categorybits,这很好,我只是不确定如何将它们应用到b2body游戏中.
我想我可能需要在初始化时检索b2body的原始b2fixture或b2fixturedef,相应地更改值然后调用方法刷新 - world.Refilter()?
这听起来有点准确吗?
奥利弗肯定赞赏任何建议.
在我的Xcode项目中,我需要在ViewController.mm中重命名我的ViewController.m,但我还需要DDMathParser.
我在.m文件中编译解析器没有任何错误.但是当我在.mm文件中编译它时,我得到以下错误:
在线解析问题:
- (DDOperatorAssociativity) associativityForOperator:(NSString *)operator;
"expected identifier"
Run Code Online (Sandbox Code Playgroud) 我正在按照书中的教程(iPhone 3D编程)进行操作,该教程使用:
包含一个示例Xcode项目,可以成功编译.
在我找到示例项目之前,我已经手动输入了本书中的代码,但我收到以下详细文件的以下编译错误:
IRenderingEngine.hpp(Xcode文件检查器 - 文件类型="默认 - C++标题")
...
struct IRenderingEngine {
virtual void Initialize(int width, int height) = 0; //2 errors as marked above
virtual void Render() const = 0; //2 errors as marked above
virtual void UpdateAnimation(float timeStep) = 0; //2 errors as marked above
virtual void OnRotate(DeviceOrientation newOrientation) = 0; //2 errors as marked above
virtual ~IRenderingEngine() {} //2 errors as marked above
}; …Run Code Online (Sandbox Code Playgroud) objective-c++ ×10
objective-c ×7
xcode ×4
c++ ×3
iphone ×3
macos ×2
box2d ×1
cocoa ×1
cocoa-touch ×1
concurrency ×1
ddmathparser ×1