标签: objective-c++

为什么断言只是终止为iPhone编译的程序?

我正在调试一个严重断言()的iPhone应用程序(Xcode,Objective-C++和设备模拟器).在某些情况下,断言失败只会终止应用程序,而不是像我期望的那样进入调试器.

我通过实现我自己的有效断言来解决这个问题:

#define AssertLite(b) if(!(b)) {asm {int 3}}
Run Code Online (Sandbox Code Playgroud)

(绒毛省略),但我想知道是否有人遇到过这个.我无法确定何时断开以及何时终止的模式.代码没有线程化; 它只是在事件处理程序中完成.

为什么会发生这种情况,如何使vanilla assert()表现得像条件断点呢?

iphone debugging xcode assert objective-c++

8
推荐指数
1
解决办法
1万
查看次数

符号未找到,预期在Flat Namespace ObjC++中

我可能有一个简单的问题,但在编译过程中没有信息错误或警告,提醒我出错的地方.

我有一个Objective-C++应用程序,其中包含C++主文件和ObjC头文件.

它构建正常,但运行时,它会给出以下错误消息:

Dyld Error Message:
  Symbol not found: _OBJC_CLASS_$_AppController
  Referenced from: /Users/slate/Documents/osirixplugins/eqOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
  Expected in: flat namespace
 in /Users/slate/Documents/osirixplugins/eqOsirix/build/Development/rcOsirix.app/Contents/MacOS/rcOsirix
Run Code Online (Sandbox Code Playgroud)

没有任何谷歌搜索导致解决方案,我敢肯定我错过了某个地方的编译或构建选项.

"AppController.h"包含在目标(已选中)中,并且包含在#importObjC类文件中.

任何帮助是极大的赞赏.

ObjC++经常让我头疼.

谢谢,

-S!

c++ macos objective-c dyld objective-c++

8
推荐指数
1
解决办法
9039
查看次数

什么"自动释放没有游泳池"是什么意思?

我的应用程序结构如下,核心部分是用C++编写的,并且大量使用线程,我在Objective C上开发UI,如果我不执行该线程它工作正常,但我无法禁用,停止线程,UI在我可以看到的日志中随机崩溃,跟随消息

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking
Run Code Online (Sandbox Code Playgroud)

类似的消息来了一次,通过谷歌搜索来了解,我需要设置NSAutoReleasePool来摆脱它,但如何可能将它与C++代码集成.

编辑:核心库将从UI激活,因此我想,可以肯定地说,UI在主线程中运行,Lib正在创建/终止线程而不通知UI,在这种情况下,我可以在UI中调用AutoReleasePool

谁能指导我?

debugging cocoa multithreading objective-c++

8
推荐指数
1
解决办法
6865
查看次数

#include <vector>没有这样的文件或目录

所以我需要在我的项目中使用向量.我已将.m文件更改为.mm以使其成为Objective-C++.但是,当我试着说:

#include <vector>
Run Code Online (Sandbox Code Playgroud)

在我的.h中,它说无法找到文件或目录.如果我把那行代码放在我的.mm文件中虽然没有出现错误,但是因为我需要一个向量@interface(在我的.h中)我该怎么办才能使.h文件找到向量文件?

此外,我已经尝试将其更改为将所有内容编译为Objective-C++,但这不起作用,因为我在使用的Cocos2d库中出现了一些错误...

iphone stl objective-c++

8
推荐指数
2
解决办法
1万
查看次数

alloca(n)和char x [n]之间有什么区别?

有什么区别

void *bytes = alloca(size);
Run Code Online (Sandbox Code Playgroud)

char bytes[size];  //Or to be more precise, char x[size]; void *bytes = x;
Run Code Online (Sandbox Code Playgroud)

...其中size是一个在编译时值未知的变量.

c objective-c objective-c++ alloca

7
推荐指数
3
解决办法
1560
查看次数

如何将glDrawElements与GL_UNSIGNED_INT一起用于索引?

我正在尝试在iPad上绘制超过65536个顶点的3d对象,但无法弄清楚我做错了什么.我使用GL_UNSIGNED_SHORT的原始模型运行得很好,但现在使用GL_UNSIGNED_INT,我无法使用glDrawElements命令显示任何内容.这就像渲染器完全忽略了我的glDrawElements线.我正在引用的渲染循环部分如下:

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);

glVertexPointer(3, GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);
glNormalPointer(GL_FLOAT, sizeof(assemblyObj->vertices[0])*6, &assemblyObj->vertices[0]);

for (int i = 0; i < assemblyObj->numObjects; i++)
{
     glDrawElements(GL_TRIANGLES, assemblyObj->partList[i].faceArray.size(), GL_UNSIGNED_INT, &assemblyObj->partList[i].faceArray[0]);
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
Run Code Online (Sandbox Code Playgroud)

顶点定义为:

vector<float> vertices;
Run Code Online (Sandbox Code Playgroud)

每个faceArray定义为:

vector<UInt32> faceArray;
Run Code Online (Sandbox Code Playgroud)

关于我做错了什么的任何建议都阻止了我的几何图形的绘制?

opengl-es objective-c objective-c++ ipad

7
推荐指数
1
解决办法
6446
查看次数

如何在Objective-C++ std :: map中使用NSString作为键

我正在开始一个Objective-C++项目的工作,在我做任何重型设计之前,先了解这两种语言的合成方式.我对自动引用计数如何与C++集成非常感兴趣:我们NSObjects在STL容器中得到了相应的智能指针,用于保存/释放句柄(参见David Chisnall在http://www.informit.com/articles上的文章)/article.aspx?p=1745876&seqNum=3).

我想使用STL映射作为从NSStringsC++值的类型安全映射.我可以将映射声明为

std::map<NSString*, MyType> mapping
Run Code Online (Sandbox Code Playgroud)

使用ARC,此映射可以正确处理内存管理.但它没有NSString正确地遵循值语义,因为它使用指针比较而不是-[NSString compare:].

使STL映射使用字符串比较而不是指针比较的最佳方法是什么?
我应该尝试专攻std::less<NSString*>吗?
我应该声明一个明确的比较器std::map<NSString*, MyType, MyCompare>吗?
我应该将NSString*键包装在一个实现的智能指针中operator<吗?

stl objective-c++

7
推荐指数
1
解决办法
2110
查看次数

交叉编译C++/Objective-C++时出错

我有一个Objective-C++项目引用的C++库.该库自身编译良好,Objective-C++项目编译良好,直到我从库中实例化第一个类(使用对象指针).在使用我的库中的类之前,我引用了string不会导致问题的stl 对象.

我收到以下错误:

Undefined symbols for architecture i386:
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      __verify_callback_c in *************.a(cxx_db.o)
      DbEnv::_stream_message_function(__db_env const*, char const*) in *************.a(cxx_env.o)
      DbEnv::_stream_error_function(__db_env const*, char const*, char const*) in *************.a(cxx_env.o)
  "std::basic_ios<char, std::char_traits<char> >::fail() const", referenced from:
      __verify_callback_c in *************.a(cxx_db.o)
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_db.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbc.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_dbt.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_env.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_mpool.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_txn.o)
      __static_initialization_and_destruction_0(int, int) in *************.a(cxx_lock.o)
      ... …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors objective-c++

7
推荐指数
1
解决办法
4082
查看次数

为什么这段代码给出EXC_BAD_ACCESS(使用IMP)

这段代码给了我EXC_BAD_ACCESS,为什么?

NSMutableDictionary  *d = [[NSMutableDictionary alloc] init];
IMP imp= [d methodForSelector:@selector(setObject:forKey:) ];
imp(d,  @selector( setObject:forKey:), @"obj", @"key");
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用IMP,第一次尝试..没有运气.不知道为什么我得到错误,也..在过去,当我得到EXC_BAD_ACCESS时,消息在控制台打印,这次错误行突出显示.

一些注意事项:ARC已启用,XCode 4.3.2,该项目使用Objective-C++作为默认语言/编译器,此代码位于项目的最开始

多谢你们

objective-c objective-c-runtime objective-c++

7
推荐指数
1
解决办法
3151
查看次数

使用.mm文件而不是.m以防万一我以后使用C++是一个坏主意吗?

假设我正在使用Apple最新的Xcode工具开发一个典型的Mac或iOS应用程序.进一步假设我主要使用Objective-C开发此应用程序,并利用Apple的Cocoa或Cocoa Touch框架中的所有相关API.

假设我目前没有计划在我的代码库中使用C++或Objective-C++,但我怀疑未来的某些时候我可能想在这里使用一些Objective-C++.

所以我正在考虑将所有.m文件命名为.mm,以防万一.(这将在我的SCM系统中产生更清晰历史的效果,因为我以后不必重命名文件.)

这是一个坏主意吗?有没有理由为什么使用.mm文件肯定或明显比使用.m文件实际上不包含任何Objective-C++时更糟糕?

据推测,这个文件扩展名翻转了编译器中的一些开关,然后编译器不仅需要解析ObjC的源代码,还需要解析C++的源代码.这是否会对中到大代码库的构建时间产生显着的负面影响?

它是否有任何其他负面(或积极)影响我应该记住?

注意:请不要回答有关ObjC或C++是否更好的任何评论.这不是这个问题的意思.

objective-c objective-c++

7
推荐指数
1
解决办法
2328
查看次数