标签: objective-c++

Objective-C字符串操作

目前我正在开发一款软件,目前使用iPhone 3.0 SDK在Objective-C中100%编写.

我来到了一个十字路口,我需要做很多或字符串连接,更具体地说,NSString连接,到目前为止,我一直这样做:

Objective-C字符串连接:

NSString *resultantString = (NSMutableString*)[@"Hello " stringByAppendingString: @"World"];
Run Code Online (Sandbox Code Playgroud)

现在你可以想象,当我尝试将6个NSStrings连接在一起时,这很难理解.

起初,我打算在Objective-C++类中混合以进行字符串连接并将其交还给我的Objective-C类,因为我可以使用C++的简单字符串连接,如:

C++字符串连接:

string cppString = "Hello" + "World" + "see" + "easy!";
Run Code Online (Sandbox Code Playgroud)

我可以使用C char数组,但这会更难阅读.

然后让我感到震惊的是,我可以在Cocoa中使用Python或Ruby桥接器(它提供了正则表达式和高级字符串处理的额外奖励,而不是基于C语言的处理).

这对我来说很有意义,尽管我只编写了少量的Ruby和Python,因为它们被称为字符串操作语言.Perl我决定跳过,因为Xcode没有直接支持它.

我也对性能感兴趣,所以我正在寻找最快的方法来进行字符串连接.

所以我该怎么做?在Objective-C中是否有一些狡猾的简单方法来连接多个字符串一次说10个字符串?或者我的想法是使用Python或Ruby类方法来返回连接或正则表达式修改后的字符串,而不是听起来非常疯狂?也许我甚至错过了另一种方式来做到这一点?

更新: 是的.考虑到拉动另一个语言运行时进行字符串操作,我似乎很疯狂,特别是因为我注意到我关注速度.添加网桥可能比简单地使用NSString/NSMutableString要慢得多.

ruby python string objective-c objective-c++

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

.cpp文件里面的Objective C语法?

我正在尝试将一些示例代码复制到我自己的项目中.示例项目是来自sdk的iPhoneExtAudioFileConvertTest.示例项目包含一个名为ExtAudioFileConvert.cpp的文件.该文件包含Objective-C代码:

assert([NSThread isMainThread]);
Run Code Online (Sandbox Code Playgroud)

示例项目运行正常,但编译器在构建我自己的项目时抱怨上面的代码:错误:在'['标记之前预期的primary-expression

这里发生了什么?显然,有一些方法可以在.cpp文件中使用目标c括号语法.我需要做些什么来使它工作?

c++ objective-c objective-c++

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

在Objective-C++中拥有自己的内存管理

对于C++代码,我可以使用placement new/delete运算符及其arraycounterparts来自行管理内存.

现在我想将我的内存管理器也用于Objective-C代码.我想过要替换NSObject alloc:dealloc:方法,但poseAsClass:不再工作了.那么:我如何使用我的内存管理器强制它?还是我完全走错了路?

c++ memory-management objective-c++ nsobject

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

从目标C类调用C++函数

我想从我的目标C类调用c ++函数我不知道如何调用它.请有人帮我提供一些示例代码或有用的链接提前感谢

iphone xcode objective-c objective-c++ ios

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

C++在XCode 4.2中没有编译(链接?)

我在Xcode中有一个非常小的程序,只显示标签并在viewWillAppear方法中更改标签的文本.label.text应该来自一个C++库,其函数如下:

int getNumber(){
    return 42;
}
Run Code Online (Sandbox Code Playgroud)

问题是,在我的*.mm(!)类中包含#import"TestLibMain.h"的类并使用该函数

TestLibMain *tlb = new TestLibMain();
int myInt = tlb->getNumber();
NSString *myString = [NSString stringWithFormat:@"%d",myInt];
Run Code Online (Sandbox Code Playgroud)

不会调用编译器错误,但会发生链接器错误:

架构i386的未定义符号:"TestLibMain :: getNumber()",引自: - tbViewController.o中的[tbViewController buttonPressed:] ld:找不到架构i386 clang的符号:错误:链接器命令失败,退出代码为1 (使用-v查看调用)

我的印象是,cpp-class尚未编译.

我尝试了很多东西,但在某个地方它已经挂了.它都在同一个目录中,我使用.mm扩展名,一切都很好,但总是这个链接器错误.变得疯狂 :-)

Mac OS X Lion,XCode 4.2

有任何想法吗?

c++ xcode objective-c objective-c++ osx-lion

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

将C++类的实例转换为NSObject,然后添加到NSMutableArray

这是一个用C++创建的简单类,用于为iOS设备创建的音乐应用程序,它将存储一些音符值及其时间:

class info {
public:
    float attackTime;
    Note noteStriked;

    void setData(float timeOfAttack, Note nameOfStrikeNote){
        attackTime = timeOfAttack;
        noteStriked = nameOfStrikeNote;
    }
};
Run Code Online (Sandbox Code Playgroud)

以上...注意是一个只能包含{SNARE,DRUM,HIHAT}等默认值的结构.我们的想法是创建一个Note对象并将这些对象存储在NSMutableArray中以供以后访问.

然后在我的主.h文件中,我有一个NSMutableArray sequenceOfNotes; 在我的.m文件中,我试图将一个对象添加到我的mutablearray ...但我不知道该怎么做.我尝试了各种各样的东西,但失败了它不起作用!

//Create one instance of the class
NoteData *currentNoteData;

// Update the instance of the class.. its two variables: attackTime and noteStriked
currentNoteData->attackTime = timeHit;
currentNoteData->noteStriked = SNARE;

//Then im trying to add the above instance to my mutableArray below
[sequenceOfNotes addObject:currentNoteData];
Run Code Online (Sandbox Code Playgroud)

在该行上产生的错误是无法初始化类型为'id'的参数,其值为'NoteData*'的左值

修复错误之后喜欢做的是能够在我选择的数组的任何位置检索我的对象,然后能够在该特定索引处从该对象中选择属性变量.

//PsuedoCode
array {
  position 0: NoteData object {
                attackTime = …
Run Code Online (Sandbox Code Playgroud)

c++ cocoa-touch objective-c objective-c++ nsmutablearray

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

Xcode项目#include <cmath>

我正在尝试使用已经在另一个独立项目中运行的代码而没有问题.

当我将此代码带入我的其他最终项目时,它表示找不到'cmath'文件.

带有#include的文件位于.hpp文件中(它只为opengl文件定义了一些结构),因此没有相应的.mm文件.(这是C++代码,我主要是一个客观的用户,所以不确定所有的c ++东西)但这是opengl的东西,并且工作正常,我们不在这个项目中.

我已经尝试了一切来完成这项工作.

带有问题的最终项目还有其他代码使用#include而没有问题.这几乎就像某些东西导致xcode不再识别标题的路径了.我检查了它的文件类型是"默认C++标题"

在最后的项目中,我使用Zxing并使用CorePlots.不确定它们是否造成任何问题.还有一些文件使用#include不确定是否可能与#incude冲突.(但#include的其他文件再次正常工作.

任何帮助将不胜感激...

xcode include objective-c++

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

当我在C++中使用块时,是否会复制或引用对象?

想象一下这个C++代码(使用clang的块语言扩展).

auto now = std::chrono::system_clock::now();

std::async(^ {
  auto time = now;
  // ...
});
Run Code Online (Sandbox Code Playgroud)

会是什么类型的time?会不会decltype(now)还是decltype(now)&?如果是后者,我怎样才能确保在块运行之前复制它?

clang objective-c++ objective-c-blocks

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

Objective-C:如果我在ARC中的函数中返回一个C++对象,它是否会创建一个副本,我是否必须手动释放该副本?

我试图在Objective-C中传递对C++对象的引用,所以我可以从另一个类访问该对象,具体来说:

// ClassA
-(b2World *)getWorld{
    return world;
}
Run Code Online (Sandbox Code Playgroud)

在另一个类中,我将返回的对象分配给ivar

// ClassB
-(void)initClassB{
    world_ = [ClassA getWorld];
}
Run Code Online (Sandbox Code Playgroud)

或者直接访问返回对象的方法

// Classb
-(void)doSomething{
    [[ClassA getWorld] doSomething];
}
Run Code Online (Sandbox Code Playgroud)

在两种情况下都复制了c ++对象(b2World)并且我必须在ARC环境中手动释放复制的对象,这是正确的吗?如果是这样,在ARC中传递c ++对象的最佳做法是什么(传递对象的所有权不应该被转移,例如它应该是一个弱引用)?

谢谢你的帮助.

c++ memory-management objective-c objective-c++ automatic-ref-counting

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

Objective-C++和operator - >

operator ->和Objective-C 有问题.

我想在ObjC类上使用C++包装器.

所以我创建了我的课程:

@interface User : NSObject

@property (nonatomic, copy) NSString *name;

@end
Run Code Online (Sandbox Code Playgroud)

还有包装类:

class UserWrapper {
    User *_user;
    //  ctors, accessors, etc.

    operator User *(){
        return _user;
    }

    User *operator->(){
        return _user;
    }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试通过operator User*它访问后备对象时,效果很好:

UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", [wrapper name]);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试通过访问此对象时 operator ->

UserWrapper wrapper([User new]);
[wrapper setName:@"alex"];
NSLog(@"%@", wrapper->name);
Run Code Online (Sandbox Code Playgroud)

我有以下错误:

Property 'name' found on object of type 'User *'; did you mean to access it with the "." …
Run Code Online (Sandbox Code Playgroud)

c++ objective-c clang objective-c++ clang++

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