在 c++ 代码中使用 objc 对象
Use objc object inside c++ code?
我有一个名为Log的ObjC类。在此类中,我有一个公共静态方法调用错误。
我想从我的C++代码中调用此方法(如果可能的话,如下所示:Log::error(string);)。
我四处走动互联网并堆叠溢出,但我只发现这个:
http://philjordan.eu/article/mixing-objective-c-c++-and-objective-c++
而这个:
从C++方法调用 Objective-C 方法?(我尝试使用第一种方法,但我不知道如何创建 void *objectiveCObject 变量。
在Log
类的头文件中,你需要提供一个带有C-linkage的回调机制,C++可以使用,你需要防止C++看到Objective-C的东西。 然后,C++和Objective-C都可以共享此标头。 另一种方法是提供单独的头文件和实现文件,仅用于C++,但这会增加实现的麻烦。
根据您的评论,我添加了C++可访问的方法来创建和销毁 Objective-C Log
对象,但是我确信要做到这一点,您必须使用 MRR 而不是 ARC,以便您可以管理生命周期。 所以你需要用-fobjc-no-arc
编译Log.m
.
日志:
#ifdef __OBJC__
#import <Foundation/Foundation.h>
#else // !__OBJC__
#include <stdarg.h>
// And maybe other C++ headers...
#endif // __OBJC__
typedef void *ObjcLog;
#ifdef __cplusplus
extern "C" {
#endif
extern ObjcLog *logCreate(const char *filename);
extern void logDestroy(ObjcLog *logObj);
extern void logInfo(ObjcLog *logObj, const char *msg, ...);
extern void logError(ObjcLog *logObj, const char *msg, ...);
#ifdef __cplusplus
} // extern "C"
#endif
#ifdef __OBJC__
@interface Log : NSObject {
// stuff
}
// Other stuff
@end
#endif // __OBJC__
日志:
#import "Log.h"
ObjcLog *logCreate(const char *filename) {
// Assumes [Log initWithFilename:]
Log *log = [[Log alloc] initWithFilename:[NSString stringWithUTF8String:filename]];
return (ObjcLog *)log;
}
void logDestroy(ObjcLog *logObj) {
Log *log = (Log *)logObj;
[log release];
}
void logInfo(ObjcLog *logObj, const char *msg, ...) {
char buffer[8192];
va_list va;
va_start(va, msg);
vsprintf(buffer, msg, va);
va_end(va);
Log *log = (Log *)logObj;
// Assumes [Log info:]
[log info:[NSString stringWithUTF8String:buffer]];
}
void logError(ObjcLog *logObj, const char *msg, ...) {
char buffer[8192];
va_list va;
va_start(va, msg);
vsprintf(buffer, msg, va);
va_end(va);
Log *log = (Log *)context;
// Assumes [Log error:]
[log error:[NSString stringWithUTF8String:buffer]];
}
@implementation Log
...
@end
然后,您的C++代码应该能够像这样使用 Objective-C Log
对象:
ObjcLog *logObj = logCreate("/path/to/file.log");
...
logInfo(logObj, "The answer is %d. What is the question?", 42);
...
logDestroy(logObj);
我可能倾向于为 Objective-C 类创建一个 C++ 包装类,这样可以更轻松地管理对象的生命周期并简化对它的访问。 但是,我将避免在此处添加它,因为它可能只会使已经过于复杂的内容复杂化。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- 代理对象的常量正确性
- 提升 ASIO 无法识别计时器对象
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何返回一个类的两个对象相加的结果
- 使用std::函数映射对象方法
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 在 c++ 代码中使用 objc 对象
- ARC/OjC++:ObjC容器内的C++对象