0

我用伪代码做了一些方法,我想创建客观的 C 方法。你能帮我定义一下吗?我对目标C不是很熟悉,所以我很困惑。另外,我想使用字符串作为方法的参数,而不是 NSString 对象。

这是方法定义。我不确定它是否符合客观的 C 定义,我也不确定“字符串”类型。

-(BOOL) testMethod(string largestring, string smallstring) {
    return true;
}

我是否必须包含一些库才能使用字符串类型?谢谢。

4

4 回答 4

3

那么这里有多种方法:

  1. 在您的 C++ 代码中,提供 C 中 C++ 方法的包装函数,使用extern "C".
  2. .mm使用扩展名(即 Objective-C++)命名您的 Objective-C 代码并直接调用 C++。

有一些限制:

  • Objective-C 无法捕获 C++ 异常,在早期版本中,C++ 也无法捕获 Objective-C 异常。
  • 在早期版本中,释放对象时不会调用 C++ 析构函数。您需要在-(void) dealloc.
  • 您不能将 C++ 对象放入 Objective-C 容器中。

一个很好的观点:

  • 在 Objective-C++ 代码中,您可以将 C++11 lambda 表达式与 Objective-C 块混合使用 - 在 clang 3.3 中它们是可以互换的。
于 2013-06-08T09:44:20.380 回答
1

你的方法应该是这样的

-(BOOL) testMethodWithLargeString:(NSString *)largestring smallString(NSString *)smallstring {
    return YES;
}

要访问此方法:

BOOL result = [<classObject> testMethodWithLargeString:string1 smallString:string2];

如果方法在 self 类中,则使用,self否则您需要使用对象或类。

此外,编写多个参数化方法的约定,(将其分成多行):

BOOL result = [<classObject> testMethodWithLargeString:string1 
                                           smallString:string2];

我是否必须包含一些库才能使用字符串类型?

,你不必使用任何像 string.h 这样的库

在可可基金会框架中,所有这些都包括在内。

于 2013-06-08T09:02:08.963 回答
1

示例代码:

-(BOOL) testMethod :(NSString *)largestring :(NSString *)smallstring {
    return YES;
}

说明:检查Apple 文档

在此处输入图像描述

采用 : [self testMethod :yourLargeString :yourSmallString];


我是否必须包含一些库才能使用字符串类型?

  • 答:不。实际上,NSString.h在内部声明Foundation.frameworkXcode默认情况下,在您创建新框架时将此框架添加到您的项目中(检查框架文件夹内)。因此,您已隐式添加了该库,这就是为什么不需要包含特定NSString类的原因。
于 2013-06-08T09:02:16.423 回答
1

你说你想使用字符串作为参数,所以我假设你不想要 C 风格char*,而是某种字符串类。由于您没有指定任何其他内容,因此在我的示例中,我使用std::string的是 C++ 标准库。

这是您的方法在 Objective-C 语法中的样子:

#import <string>

- (BOOL) testMethodWithLargeString:(const std::string&)largeString smallString:(const std::string&)smallString
{
  return YES;
}

一些注意事项:

  • 要完成这项工作,您必须将其放在扩展名为.mm. 扩展名告诉编译器该文件包含混合的 C++ 和 Objective-C 代码
  • std::string来自 C++ 标准库,但我相信您不必做任何特别的事情来使您的项目链接到该库。
  • 您必须决定是要使用BOOL(大写)还是bool(小写)作为返回类型。BOOL是传统的 Objective-C 布尔类型,而bool是传统的 C++ 原始布尔类型。WithBOOL你必须使用YESandNO作为返回值,而 withbool你必须使用trueand false。你不应该尝试混合这两种类型和它们的值,它不会让编译器高兴(如果你使用强制转换来强制编译器接受混合,迟早会不高兴)
  • 尝试坚持const std::string&作为in参数的类型。这const将使您免于意外更改参数的内容。如果您只使用std::string&(不使用const),则参数将成为out参数。我还建议您不要使用指针(即const std::string*or std::string*),因为std::string它是一种值类型(如果不熟悉,请阅读该主题),因此通常与引用结合使用。最后但并非最不重要的一点:永远不要使用std::string即没有&[reference] 或*[pointer])——如果你这样做了,每次调用该方法时都会创建一个字符串的副本。如果您已经知道所有这些事情,那么您当然可以忽略我的建议 :-)
  • 关于方法命名的最后一句话:Objective-C 的一个特点是方法名称被分成“部分”,每个参数一个。这样做的好处是您可以将参数名称直接构建到方法名称中,结果是当您调用方法时,代码更具表现力并且更易于阅读。其他语言中的类似功能是命名参数(也称为关键字参数)。

Maxthon Chan 的回答还提供了有用的提示,说明在混合 C++ 和 Objective-C 时需要考虑什么。

于 2013-06-08T11:33:39.520 回答