我有一个 Objective-C 类,其中一个变量是 C++ 对象(我的大部分代码是 C++,但我需要一些 ObjC 类来与 iOS 库集成)。Objective-C++ 是否保证在销毁Objective-C 对象时C++ 对象会被正确销毁?
一些示例代码:
class MyCppClass {
// ...
};
@interface MyObjCClass : NSObject {
MyCppClass myCppObject; // is it ok to do it?
}
// ...
@end
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的 iOS 应用程序编写 XCTest 单元测试。我正在使用 XCode 5.1.1。
我遇到的问题是,当我包含一个头文件,其中包含一个看起来像这样的头文件时,
#include <google/protobuf/stubs/common.h>它抱怨找不到该文件。
google我已在测试目标的标头搜索路径中包含了包含该文件夹的目录的相关路径。我已将其标记为始终使用搜索路径并递归搜索。
我的应用程序目标发现该路径没有任何问题,并且我以完全相同的方式包含它。我的单元测试类是 Objective-C++ 类,因为我已将文件名更改为.mm扩展名。
有什么想法为什么我会遇到找不到文件的问题吗?
这段代码
virtual const core::matrix4& getViewMatrixAffector() const {return core::matrix4();};
Run Code Online (Sandbox Code Playgroud)
结果有一个警告告诉我“返回对本地临时对象的引用”......
如何解决这个警告?
如下所述,我试图删除“&”...

我需要在C++类的Objective c中编写一个包装类.
我已经提到了以下无法找到标准C++包括在Cocoa项目中使用C++类时能够摆脱词法或预处理器问题:'vector'文件未找到问题.
但是,我不明白将C++方法转换为接受客观c方法的几个参数.
有人可以帮我这样做吗?我想要做的是为此http://breakfastquay.com/rubberband/code-doc/classRubberBand_1_1RubberBandStretcher.html#a0af91755d71eecfce5781f2cd759db85编写一个包装类
我试过这样做,以下是我坚持的方法......
// Wrapper.h
#import <Foundation/Foundation.h>
@interface Wrapper : NSObject {
void *myRubberBandStretcher;
}
#pragma mark - Member Functions
-(void)process:(const float)input samples:(size_t)samples final:(bool)final;
@end
Run Code Online (Sandbox Code Playgroud)
////////////////////////////////////////////////// ///////////////////////////////
//Wrapper.mm
#import "Wrapper.h"
#import "RubberBandStretcher.h"
@implementation Wrapper
-(id)init {
self = [super init];
if (self) {
myRubberBandStretcher = new RubberBand::RubberBandStretcher::RubberBandStretcher(44100, 2, 0, 1.0, 1.0);
}
return self;
}
-(void)process:(const float)input samples:(size_t)samples final:(bool)final {
static_cast<RubberBand::RubberBandStretcher *>(myRubberBandStretcher)->process(<#const float *const *input#>, <#size_t samples#>, <#bool final#>)
}
Run Code Online (Sandbox Code Playgroud) 将 C++ 组件添加到通过命令行编译和运行的 Swift 应用程序后,我现在需要编译 C++ 和 Objective-C++ (*.mm) 文件并将它们与 Swift 应用程序链接。
生成文件:
all: foo-renderer
clean:
rm -f foo-renderer cpp.o objc.o
cpp.o: FooRenderer/FooRenderer/FooLibrary.cpp
clang++ -c -o $@ $^
objc.o: cpp.o FooRenderer/FooRenderer/FooLibraryWrapper.mm
clang++ -c -framework Foundation -o $@ $^
foo-renderer: objc.o FooRenderer/FooRenderer/*.swift
xcrun -sdk macosx swiftc -import-objc-header FooRenderer/FooRenderer/FooRenderer-Bridging-Header.h -o $@ $^
Run Code Online (Sandbox Code Playgroud)
编译器失败并出现以下错误:
ld: warning: object file (objc.o) was built for newer OSX version (10.12) than being linked (10.9)
Undefined symbols for architecture x86_64:
"__ZN11FooLibrary23printifyERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE", referenced from:
-[FooLibraryWrapper printify:] in objc.o
"__ZN11FooLibrary8optimizeERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEE", …Run Code Online (Sandbox Code Playgroud) 我似乎在将相机设置为以 240 FPS 录制时遇到问题,但由于某种原因,输出文件仅为 30 FPS。
这是我设置相机的代码(首先实例化):
class HFRCamera {
public:
HFRCamera();
AVCaptureDeviceInput *camera;
AVCaptureDeviceInput *microphone;
AVCaptureDevice *videoCam;
AVCaptureDevice *audioInput;
AVCaptureSession *capSession;
void start();
void config();
void stop();
};
HFRCamera::HFRCamera() {
// Set up capture session and add video camera and microphone
this->capSession = [[AVCaptureSession alloc] init];
this->videoCam = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
this->config();
}
void HFRCamera::start() {
[this->capSession startRunning];
}
void HFRCamera::stop() {
[this->capSession stopRunning];
}
void HFRCamera::config() {
const CGFloat desiredFPS = 240;
AVCaptureDeviceFormat *selectedFormat = nil;
AVFrameRateRange *frameRateRange = …Run Code Online (Sandbox Code Playgroud) 我有一个使用 Objective C++ 和一些外部 C++ 库的 iOS 应用程序,该应用程序使用 Crashlytics 来跟踪可能的用户崩溃。
Crashlytics 愉快地处理来自 Objective C 领域的所有异常,这在过去帮助我很多来追踪问题,我想从 C++ 端获取相同类型的崩溃日志,无论何时抛出任何异常。
不幸的是,当 std::exception 被调用时,我在 Crashlytics 中得到的只是一个不包括原点的通用堆栈跟踪,这无助于解决这些问题,也无助于任何 std 异常进入相同的事实一刀切累积的“崩溃”类型。
我可以捕获这些异常并以某种方式重定向它们,以便它们出现在 Objective C 发起的崩溃旁边吗?
我正在尝试类似的东西,但我似乎无法让它工作,同时保持 Crashlytics 处于相同的工作状态,我错过了什么吗?
我正在考虑的另一个可能的解决方案是捕获 C++ 异常并使用 Crashlytics 本身将它们记录为错误,然后从包装器中重新抛出它们。
https://docs.fabric.io/apple/crashlytics/logged-errors.html
未处理的 C++ 异常后的示例堆栈跟踪:
Crashed: com.twitter.crashlytics.ios.exception
0 MyApp 0x100d9baac CLSProcessRecordAllThreads + 4312709804
1 MyApp 0x100d9baac CLSProcessRecordAllThreads + 4312709804
2 MyApp 0x100d9b968 CLSProcessRecordAllThreads + 4312709480
3 MyApp 0x100d8b6b8 CLSHandler + 4312643256
4 MyApp 0x100d99ac4 __CLSExceptionRecord_block_invoke + 4312701636
5 libdispatch.dylib 0x182556a14 _dispatch_client_callout + 16
6 …Run Code Online (Sandbox Code Playgroud) 我想将回调块从 Objective-C++ 代码传递到 C++ 对象。这非常简单,因为我可以将一个块分配给 std::function。在我的迷你示例中,一切正常,但我仍然不确定这样做是否安全。
#import "ViewController.h"
#include <functional>
std::function<void(void)> f;
@interface T : NSObject
@property (strong) NSString* value;
@end
@implementation T
- (void)dealloc {
NSLog(@"dealloc");
}
@end
@implementation ViewController
- (IBAction)storeBlock:(UIButton *)sender {
T* t = [[T alloc] init];
t.value = @"the captured obj";
f = ^void(void) { NSLog(@"This is the block with %@", t.value); };
}
- (IBAction)useBlock:(UIButton *)sender {
f();
}
- (IBAction)releaseBlock:(UIButton *)sender {
f = nullptr;
}
@end
Run Code Online (Sandbox Code Playgroud)
我了解到这些块存储在堆栈上,如果我想在块创建的范围之外使用它,我必须将其复制到堆(我在示例中没有明确这样做)。我也不确定 ARC 如何处理这种情况。“官方”允许这样做吗?我正在使用 Xcode 9.2。
概述
我正在将 C++ / ObjC++ 库移植到 Swift 包管理器。该库针对常见的 Apple 平台(iOS、macOS)。目前,可以使用xcodebuild静态库目标来构建该库。
问题
由于该库包含 C++ <> ObjC 桥接代码,因此它有一个使用 标志编译的文件-fno-objc-arc。所有其他文件均使用 ARC 编译。是否可以传递一个标志,告诉 SPM 在没有 ARC 的情况下也编译该文件?
截屏
包.swift
// swift-tools-version:5.4
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "library_name",
platforms: [
.iOS(.v13)
],
products: [
.library(
name: "library_name",
targets: ["library_name"]),
],
dependencies: [
],
targets: [
.target(
name: "library_name",
dependencies: [],
path: "./sources/",
exclude: [ …Run Code Online (Sandbox Code Playgroud) c++ objective-c++ automatic-ref-counting swift swift-package-manager
我在自己的应用程序中遇到了一个有趣的 Metal 性能问题,我只需对此示例项目进行少量调整即可重现该问题。我的视图大小约为 1600x900,如下所示:
\n\n每帧有两次绘制调用,一次用于背景,一次用于线条。背景由4个顶点组成,线条大约有2000个顶点。当场景像上面一样绘制时,Xcode 的 GPU 帧捕获告诉我整个帧需要大约 4 毫秒(!)。一些观察结果:
\n这对我来说没有意义。为什么上述变化会对帧时间产生如此巨大的影响?这是 100 倍的差异。
\n我正在 2018 Mac mini(配备 Intel UHD Graphics 630 1536 MB)上运行代码,以防万一这很重要。
\n以下是对演示项目所做的更改:
\nMTLBuffer在初始化期间创建两个sAAPLVertex quadVertices[] = { ... 4 vertices omitted ... };\nquadBuffer = [_device newBufferWithBytes:quadVertices length:4 * sizeof(AAPLVertex) MTLResourceStorageModeManaged];\n\nAAPLVertex dataVertices[] = { ... ~2000 vertices …Run Code Online (Sandbox Code Playgroud) objective-c++ ×10
c++ ×5
ios ×5
objective-c ×3
xcode ×3
swift ×2
avfoundation ×1
clang ×1
clang++ ×1
crashlytics ×1
gpu ×1
intel ×1
irrlicht ×1
macos ×1
metal ×1
rubber-band ×1
xctest ×1