- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
是否可以使用 [[NSProcessInfo processInfo] operatingSystemVersion]来自 C++ 或 C,我该怎么做?
最佳答案
在 XCode 和 Objective-C 中,扩展名为 .mm
的文件被视为“混合”文件,因为一个文件可以包含 C++/C 概念以及 Objective-C 代码,并且甚至 C++/C 函数实现也可以访问 Objective-C 类并向它们发送消息。
这样的 .mm
文件可以提供一个 trampoline 函数,即公开的 C 风格函数,然后可以在纯 C++/C 文件(扩展名 . cpp
,其中不得出现 Objective-C 代码)。
让我们考虑以下设置:
ProcessInfoProvider.mm
,它调用 [[NSProcessInfo processInfo] operatingSystemVersion]
并在 C 风格函数 std::string 中提供结果getProcessInfoVersion_C()
,UseProcessInfoInC.cpp/hpp
定义了一个类 MyCppProcessInfo
,它提供了一个 printVersion()
-成员函数,它使用 getProcessInfoVersion_C
,MyCppProcessInfo
并调用成员函数 printVersion()
让我们从 ProcessInfoProvider.mm
开始:
#import <Foundation/Foundation.h>
#import <Foundation/NSProcessInfo.h>
#include <string.h>
#include <iostream>
std::string getProcessInfoVersion_C (void) {
NSProcessInfo *processInfo = [[NSProcessInfo alloc] init];
// check avaiability of the property operatingSystemVersion (10.10+) at runtime
if ([processInfo respondsToSelector:@selector(operatingSystemVersion)])
{
NSOperatingSystemVersion versionObj = [processInfo operatingSystemVersion];
char version[500];
snprintf(version, 500, "Version %ld.%ld.%ld",
(long)versionObj.majorVersion,
(long)versionObj.minorVersion,
(long)versionObj.patchVersion);
return version;
}
else
{
// Implement fallback for OSX 10.9 and below
return "?";
}
}
请注意,getProcessInfoVersion_C
是一个 C 风格的函数,但在其实现中包含 Objective-C 代码。
然后,纯C++文件UseProcessInfoInC.cpp/hpp
实现类MyCppProcessInfo
:
// UseProcessInfoInC.hpp:
#ifndef UseProcessInfoInC_hpp
#define UseProcessInfoInC_hpp
class MyCppProcessInfo {
public:
void printVersion(void);
};
#endif /* UseProcessInfoInC_hpp */
和
// UseProcessInfoInC.cpp:
#include "UseProcessInfoInC.hpp"
#include <iostream>
extern std::string getProcessInfoVersion_C (void);
void MyCppProcessInfo::printVersion(void)
{
std::string version = getProcessInfoVersion_C();
std::cout << version;
}
请注意,这两个文件不包含任何 Objective-C 内容。最后,让我们试试 MyCppProcessInfo
,例如在函数 main()
中:
// File main.mm
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#include "UseProcessInfoInC.hpp"
int main(int argc, char * argv[]) {
@autoreleasepool {
MyCppProcessInfo pi;
pi.printVersion();
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
关于c++ - 从 C++ 使用 NSProcessInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41184989/
系统重新启动后,我无法获取 NSTimeInterval。这个函数给了我一个错误的结果。当设备电池充电时,重新启动时间将重新开始。 iPhone 5s 和 iPad 3(新款)上出现问题。我该如何
根据NSProcessInfo docs , -physicalMemory 返回“以字节为单位的物理内存量”。但是,在我的 32 GB iPhone 5 上,它返回 1065000960,这只有大约
我的应用程序中有以下代码。它的行为可以通过在其进程信息的环境字典中设置“MY_KEY”键来改变。 func myMethod() { var environment = NSProcessInfo
我想 stub [[NSProcessInfo processInfo] operatingSystemVersion] 以获取任何操作系统版本。 id processInfoMock = OCMCl
是否可以使用 [[NSProcessInfo processInfo] operatingSystemVersion]来自 C++ 或 C,我该怎么做? 最佳答案 在 XCode 和 Objectiv
我试图以编程方式确定系统路径中是否存在特定的二进制文件。为了获得环境,我使用了两者 NSString* path = [[[NSProcessInfo processInfo] environment
在 Python 3.6(也可能是 3.7)下运行 Jupyter Lab 内核会抛出:AssertionError: Couldn't find Class NSProcessInfo在 Pytho
所以我刚刚开始深入研究 Objective-C、Cocoa 和 iPhone 开发。我遇到了一件我不太明白的奇怪事情。 我正在尝试获取进程信息,进程名称工作正常,但是当我尝试同时获取进程 ID 时,事
我有一个使用 Swift 2.2 构建的 iOS 应用程序,最近开始出现问题。它在通过 Xcode 构建和运行时工作正常,但在从 Xcode 停止应用程序然后尝试直接从手机(真实设备和模拟器)再次打开
我是一名优秀的程序员,十分优秀!