我从设备中取出的iPad崩溃中获得了以下堆栈跟踪.这是从用户的iPad中提取的,我不知道它们崩溃时他们在做什么.我如何获得有关应用程序崩溃和修复的原因/位置的更多信息?
Uncaught C++ Exception Stack trace: 0 - 0 MyApp 0x00005ac1 _Z16TerminateHandlerv + 24 1 - 1 libstdc++.6.dylib 0x33814e3d _ZN10__cxxabiv111__terminateEPFvvE + 52 2 - 2 libstdc++.6.dylib 0x33814e91 _ZSt9terminatev + 16 3 - 3 libstdc++.6.dylib 0x33814f61 __cxa_throw + 84 4 - 4 libobjc.A.dylib 0x3441dc8b objc_exception_throw + 70 5 - 5 Foundation 0x3645192b __NSThreadPerformPerform + 654 6 - 6 CoreFoundation 0x34e16a79 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 12 7 - 7 CoreFoundation 0x34e1875f __CFRunLoopDoSources0 + 382 8 - 8 CoreFoundation 0x34e194eb __CFRunLoopRun + 230 9 - …
简短版本:我有一个Qt/C++,我不得不添加有限数量的Cocoa/Objective-C代码.我已将.cpp文件更改为.mm文件,并将objective-c代码/对象添加到所述文件中,并进行编译和工作.我现在需要为我创建的一个对象 - 一个NSPopUpButton(或者更确切地说,它的菜单)代表一个委托 - 而且我被卡住了.如何为此对象添加委托?
详细信息:有问题的文件:
reportwindow.h,reportwindow.cpp更新为reportwindow.mm - 这些文件包含我原来的C++实现和一些objective-c代码(打开一个包含NSPopUpButton的NSSavePanel).reportwindow.h还包含在.cpp文件中,如果这有所不同.
menuHandler.h,menuHandler.mm - 这些文件包含一个(当前为空)的objective-c类,我打算将其用作委托
我的第一个想法是,我可以简单地将C++类作为委托,但这显然不起作用,因为直接的C++不理解委托.然后我想我将一个单独的objective-c类作为NSMenuDelegate,并将它的一个实例添加为我的C++类的成员对象.由于我已经能够添加其他objective-c对象作为成员,我认为这应该工作.但是,只要我在C++类头文件中包含了我的新objective-c类的头文件,我就会从苹果头文件(NSValue.h)中获得几百个关于"'''令牌之前的非预期不合格ID"的错误. ,NSObject.h等)显然这不起作用,至少不是原样.在我的类头文件中包含任何cocoa头时,我得到相同的结果.
然后我想我会尝试使用objective-c类的前向声明(这就是我让其他Objective-c对象工作的方式).但是,这也没有用 - 如果我将其声明为"class myClassName",我会收到一个关于将类重新定义为不同类型符号的错误(可能是c ++类vs objective-c协议).如果我尝试将其声明为@protocol myClassName,我会收到关于"'''令牌之前的预期unqualified-id"的错误.那我怎么能做这个呢?
我正在尝试将代码从AurioTouch项目移动到我的项目中.但我有很多错误:
Unknown type name 'class'; did you mean 'Class'?
Run Code Online (Sandbox Code Playgroud)
例如,在文件FFTBufferManager.h中:
#include <AudioToolbox/AudioToolbox.h>
#include <libkern/OSAtomic.h>
#include "SpectrumAnalysis.h"
class FFTBufferManager
{
public:
FFTBufferManager(UInt32 inNumberFrames);
~FFTBufferManager();
Run Code Online (Sandbox Code Playgroud)
我试图将编译器更改为LLVM GCC 4.2,但它会产生很多其他错误:
Expected '=', ',', ';', 'asm' or '__attribute__' before 'FFTBufferManager'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我最近遇到了麻烦,试图象征iOS应用程序的崩溃日志.由于某种原因,dSYM的UUID未在Spotlight中编入索引.经过一些手动搜索和健康剂量的命令行咒语,我设法部分地表示崩溃日志.
起初我认为dSYM可能是不完整的或类似的东西,但后来我意识到缺少的方法是在C++代码中发生的:这个项目是一个调用C++库的Objective-C应用程序(通过Objective-C++)它回调Objective-C代码(再次,通过Objective-C++代码).我缺少的调用,特别是在C++领域发生的调用.
所以,我的问题是:符号化过程是否有某种方式可以解决C++代码的函数调用?如果有的话,我需要设置哪些特殊选项?
编译objective-c源代码和objective-c ++源代码时,我有所不同.
这里是test.h中Class1和Class2的声明:
#import <Foundation/Foundation.h>
@interface Class1 {
}
@end
@interface Class2 {
}
@end
Run Code Online (Sandbox Code Playgroud)
现在,这是test.m中的Objective-C实现:
#import "test.h"
@implementation Class1
/* static member */
static int mystatic;
@end
@implementation Class2
/* static member */
static int mystatic;
@end
Run Code Online (Sandbox Code Playgroud)
我用这个命令成功编译:
gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c -c test.m
Run Code Online (Sandbox Code Playgroud)
现在我完全使用这个Objective-C++实现test.mm(完全相同的源代码):
#import "test.h"
@implementation Class1
/* static member */
static int mystatic;
@end
@implementation Class2
/* static member */
static int mystatic;
@end
Run Code Online (Sandbox Code Playgroud)
并使用此命令行进行编译(-x选项中的差异):
gcc -arch armv6 -isysroot /Developer/.../iPhoneOS5.0.sdk -x objective-c++ -c …Run Code Online (Sandbox Code Playgroud) 我主要是一个C++人.由于C++缺少官方ABI,我总是使用类似COM的方法来支持多个编译器的组件设计.
最近我遇到的问题是Objective-C是否会取代类似COM的方法.显然,对于Objective-C来说,替换它需要一个稳定的ABI,因此我想知道Objective-C是否存在稳定的ABI(在所有主要操作系统[OSX,GNU/Linux,Windows]上)以及如何容易它将使用Objective-C(++)作为由不同编译器创建的组件之间的"粘合剂".
编辑: 正如Nikolai Ruhe所指出的,对COM的简短描述可能会有所帮助.COM本质上是一个"二进制标准",它允许混合不同编译器(以及各种语言)的二进制文件.COM的工具是接口,它定义了方法(映射到C++的虚函数).组件实现至少一个接口并作为DLL分发.它们可以位于系统的任何位置(位置在注册表中指定),并且可以由任何COM客户端通过它们实现的接口的ID加载.
我有一个应用程序(只有ios5),在方法内部声明一个在块内使用的弱变量来引用一个视图控制器的实例.
QRCodeViewController * __weak weakSelf = self;
Run Code Online (Sandbox Code Playgroud)
问题是编译器显示警告说:
无法在自动变量上指定__weak属性
在那个应用程序中我使用了很多弱引用,我从来没有看过这样的警告,与其他类的唯一区别是这个类是在.mm文件中实现的,因为它使用了c ++对象而项目无法编译如果我把它留作.m.
我必须说代码似乎工作正常.
有什么建议吗?
weak-references objective-c objective-c++ ios automatic-ref-counting
什么是superview,什么是子视图?
当我添加此代码时:
[self.view addSubview:self.frontView];
// what does that mean ?
Run Code Online (Sandbox Code Playgroud)
和...
@property (nonatomic, strong) IBOutlet UIImageView *frontView;
[self.frontView superview] != nil // means ?
Run Code Online (Sandbox Code Playgroud)
在superview中是什么?
我想在iOS项目中使用Protocol Buffers.我试图避免将整个项目变成Objective-C++惨败,所以我想将C++ protobuf类包装成Objective-C类.我有几十个protobuf消息,虽然我一次成功地完成了一个类,但理想情况下我想使用继承来最小化重复的代码.我是Objective-C的新手,我在10年内没有使用过我对C++的了解,所以这主要是一种令人沮丧的练习.下面是我如何包装单个邮件的示例.
码
.proto:
message MessageA {
optional string value = 1;
}
Run Code Online (Sandbox Code Playgroud)
MessageAWrapper.h:
#import <Foundation/Foundation.h>
@interface MessageAWrapper : NSObject
@property (nonatomic) NSString *value;
+ (id)fromString:(NSString *)string;
- (NSString *)serialize;
@end
Run Code Online (Sandbox Code Playgroud)
MessageAWrapper.mm:
#import "MessageA.h"
#import "message.pb.h"
@interface MessageAWrapper ()
@property (nonatomic) MessageA *message;
@end
@implementation MessageAWrapper
- (id)init
{
self = [super init];
if (self) {
self.message = new MessageA();
}
return self;
}
- (void)dealloc {
delete self.message;
self.message = NULL;
}
- (NSString *)value {
return [NSString …Run Code Online (Sandbox Code Playgroud) 基本上,标题是不言自明的.我用以下方式使用它:
std::mutex到lock和unlock std::vector<T>跨越整个班级的编辑选项,如C++的std容器不是线程安全的.objective-c++ ×10
objective-c ×8
c++ ×4
ios ×2
xcode ×2
c++11 ×1
compilation ×1
debugging ×1
ipad ×1
iphone ×1
mutex ×1
redefinition ×1
static ×1
view ×1
xcode4 ×1