是否可以将 NSMutableArray 的内容转换为 std::vector ?如果是这样,应该在 Objective-C 或 C++ 代码中完成吗?
我正在尝试在 Swift 中转换 Webp 中的 PNG 图像,我工作的唯一框架是OpenCV通过Objective-c++。
问题是,如果我将图像大小调整为 512x512(这是我需要的分辨率),它就会崩溃:
如果我将图像大小(无论是使用 OpenCV 还是使用 Swift)调整为另一个分辨率(例如 510x510),它不会崩溃。
奇怪的是,在模拟器上它永远不会崩溃,而在 iPhone XS 上它崩溃的次数达到 90%。
如何在 Swift 中将 PNG 转换为 Webp?如果 Mat 是 512x512,为什么 OpenCV 在imwrite
指令上崩溃?
更新:
OpenCV 版本:3.4.2
我发现当之前从 Core Graphics 框架处理 PNG 图像时会发生此问题。我需要使用它,因为我以这种方式将 UIVIew 保存为 UIImage:
let renderer = UIGraphicsImageRenderer(bounds: bounds)
return renderer.image { rendererContext in
layer.render(in: rendererContext.cgContext)
}
Run Code Online (Sandbox Code Playgroud) 我在Cocoa应用程序中使用一个小的C++库(atm只是一个非常简单的例子来学习我应该怎么做).
所以我在命名空间中有一个小的C++类,如下所示:
namespace testlib {
class Test {
public:
Test(unsigned a);
Test operator+(const Test& other) const;
Test operator+(unsigned other) const;
Test& operator+=(unsigned other);
Test& operator+=(const Test& other);
unsigned getValue() const;
private:
unsigned theValue;
};
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个带有以下代码的.h文件:
#import <Foundation/Foundation.h>
#import "testlib.h"
@interface test : NSObject {
testlib::Test* testClass;
}
- (id)init;
- (id)add: (unsigned)value;
- (unsigned)value;
- (void)dealloc;
@property void* testClass;
@end
Run Code Online (Sandbox Code Playgroud)
最后一个实现(在一个名为test.mm的文件中):
#import "test.h"
@implementation test
@synthesize testClass;
- (id)init {
testClass = new testlib::Test(0);
return self;
}
- (void)dealloc …Run Code Online (Sandbox Code Playgroud) 我使用LuaObjCBridge在一个Objective-C应用程序中嵌入了Lua.如果需要花费太多时间(无限循环?),我需要知道如何停止Lua进程.
会在单独的线程中运行它有帮助吗?
我正在开发一个GameKitHelper类,它主要用C++编写,但在某些地方使用Objective-C,在.mm文件中.
我删除了一些功能来隔离错误:
void GameKitHelper::PopulateFriendScores(DynArray<GameCenterScore> *FriendScores)
{
GKLeaderboard *leaderboardRequest = [[GKLeaderboard alloc] init];
if (leaderboardRequest != nil)
{
leaderboardRequest.playerScope = GKLeaderboardPlayerScopeFriendsOnly;
leaderboardRequest.timeScope = GKLeaderboardTimeScopeAllTime;
leaderboardRequest.range = NSMakeRange(1,25);
[leaderboardRequest loadScoresWithCompletionHandler: ^(NSArray *scores, NSError *error)
{
int i = 0;
printf("%d", i);
}];
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
'int GameKitHelper::i' is not a static member of 'class GameKitHelper'
Run Code Online (Sandbox Code Playgroud) 我有一个基本问题,在使用时NSOutputStream,我们是否应该等待NSStreamEventHasSpaceAvailable发送数据包,以便我们可以[NSOutputStream write]在需要时调用它,
我相信NSStream应该照顾写功能......
如果这不正确,那么请提供您对以下逻辑的看法,
=====写上NSOutputStream=================有队列添加数据包,即发送//StreamQueue.h
@interface StreamQueue : NSObject <NSCoding>
{
NSMutableArray * data;
NSRecursiveLock * theLock;
}
#pragma mark ?Initialization & Deallocation?
- (id)init;
- (id)initWithQueue:(CommQueue *)queue;
- (id)initWithCoder:(NSCoder *)coder;
- (void)dealloc;
- (void)encodeWithCoder:(NSCoder *)coder;
#pragma mark
#pragma mark ?Accessor Methods?
- (int)size;
- (BOOL)isEmpty;
- (id)top;
- (NSArray *)data;
#pragma mark
#pragma mark ?Modifier Methods?
- (void)enqueue:(id)object;
- (id)dequeue;
- (void)removeAll;
@end
Run Code Online (Sandbox Code Playgroud)
及其实施
#import "StreamQueue.h"
@implementation StreamQueue …Run Code Online (Sandbox Code Playgroud) 我需要在继承C++类,这与iPhone摄像头视频录制(获得作品使用的Objective-C++代码CMSampleBufferRef通过其他本地Objective-C类Wrapper用CMSampleBufferDelegate).
的AVCaptureVideoOutput,我有自己的工作dispatch_queue_t callbackQueue,所以,当我想从我得到的最后一帧Wrapper类,我需要锁定callbackQueue,使其等到复制将完成.
据我所知,已完成dispatch_sync,同步captureOutput.callbackQueue.但我不能让这段代码工作:
// .mm
frame_t MyCppClass::getLastFrame()
{
dispatch_sync(pCaptureVideoDataOutput.sampleBufferCallbackQueue, ^{ // error: no matching function for call to 'dispatch_sync'
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(wrapperInstance->currentBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0);
// doing copying frame data from buffer...
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
}); // error: control may reach end of non-void block
return frame;
}
// .h
@interface Wrapper : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate> {
CMSampleBufferRef currentBuffer;
}
@end
// .mm
@implementation …Run Code Online (Sandbox Code Playgroud) objective-c objective-c++ grand-central-dispatch ios avcapture
我终于有了一个非常我通过CLI工作图搜索的基本版本,但我发现自己在我需要重构所有的代码的位置.因为我在mac上进行这个编程,所以我在考虑使用Cocoa作为GUI,然后将我的C++函数作为workhorses使用.这只是一个临时修复,因为最终我希望能够在linux盒/集群上运行我的所有代码. 这是我关于实现的最后一个问题,我确实让它在boost中工作,滚动我自己的图形函数(现在).
所以这就是我的想法:为图形本身构建C++类,并为我想要计算的量建立单独的函数或方法. 这是我能找到的最新描述,它涉及混合Objective-C和C++.但我想知道:
是否会优化在Xcode中编译我的C++代码?重点是我希望C++代码能够完全优化以实现快速内存访问,多线程,并且可以访问boost库.然后,我可以将C++类封装在一个包装ObjectiveC类中.要做到这一点,我基本上有2个类,对吗?C++类包含.h和.cpp文件并包含boost库,然后是带有.h和.mm文件的ObjC类包装器,其中.h不包含对C++类的任何引用,我使用include in .mm文件.然后,我可以使用目标C.我正常的MVC设计和执行GUI只要我给dealloc的命令核弹攻击的C++类的能力,我不必担心内存管理?ARC是否也适用于C++,它是否能让OSX能够内存管理和清理我的C++代码?
我怀疑,如果我想穿,我会去的升压线程,因为编码GCD将使平台特定的(尽管就目前而言,这是所有将在运行).我认为,就目前而言,我将远离核心数据,因为我只是通过解析文本文件来创建我的图形.
在这种情况下,如何将std :: string转换为NSString?
void Piles::imagePlacer(Card card, int xCoord, int yCoord) {
string cardType = card.toString();
UIImageView *cardImg = [[UIImageView alloc]
initWithImage:cardType];
cardImg.frame = CGRectMake(xCoord, yCoord, 126, 190);
[self.view addSubview:cardImg];
}
Run Code Online (Sandbox Code Playgroud)
我想使用一个字符串作为图像的名称(假设我有一个UIImages列表,其名称对应于存储在cardType中的所有可能的字符串)?
我在项目中遇到了这个问题,并将其归结为以下示例代码:
#import <map>
typedef std::map<int, int> exampleMap;
@interface ViewController ()
@property (nonatomic, assign) exampleMap map;
@end
@implementation ViewController
- (IBAction)iterateWithSelf:(id)sender
{
for (exampleMap::iterator iter = self.map.begin(); iter != self.map.end(); ++iter)
{
NSLog(@"We should never hit this line as map is empty");
}
}
- (IBAction)iterateWithIVar:(id)sender
{
for (exampleMap::iterator iter = _map.begin(); iter != _map.end(); ++iter)
{
NSLog(@"We should never hit this line as map is empty");
}
}
@end
Run Code Online (Sandbox Code Playgroud)
- iterateWithIVar:执行正常,没有任何内容记录到控制台.
- iterateWithSelf:进入for循环,在控制台上打印一行,然后崩溃EXC_BAD_ACCESS
然后我尝试插入... self.map.insert(std::pair<int, int>(0, 1)); …