0

我有一个方法,它采用以下参数。

void callAMethood(const void *iVar){}

现在在这里我不清楚我应该如何指针

以下似乎很简单,我只是传递地址而不是值。

NSString *a=@"Hi";
callAMethood(&a);

但是,以下似乎效果很好,但理解语法很困难。

char const * const a="HI";
callAMethood(&a);

甚至这也有效callAMethood(a);

4

4 回答 4

4

正如 xlc 指出的那样,两者都是错误的。

NSString *a=@"Hi";
callAMethood(&a); // This passes a NSString **


char const * const a="HI";
callAMethood(&a); // This passes a char const * const *

两者都有效,因为指向指针的指针仍然可以转换为void *.

但是,您也不太可能打算这样做。

利用在编译时对 C 进行类型检查的优势,并更具体地处理您的类型。

void awesome_function(NSString *amazingString);

NSString *yay = @"oh my god yes";
awesome_function(yay); // ok
awesome_function(&yay); // compiler error

简而言之:除非您有充分的理由使用 a void *(我认为这对于 Cocoa(Touch) 应用程序来说不太可能),否则不要。

如果您不想进行编译时类型检查,请使用 Python 之类的东西。如果您希望能够处理不同的 Objective C 对象类型,这就是id目的。

于 2013-06-13T02:12:30.520 回答
1

你问你应该传递给函数什么(它不是方法的声明):

void callAMethood(const void *iVar) {...}

答案是没有人能告诉你!

您的函数采用类型的值void *- 这种类型通常在 C 中用于表示“指向任何东西的指针”。它不是一种用于将指针指向任何对象的函数的类型,即id.

但这并没有让我们走得太远,因为我们不知道callAMethood期待什么我们不知道要通过什么 - 我们无法告诉你答案。

现在你举个例子:

NSString *a = @"Hi";
callAMethood(&a);

这是一个有效的调用,它传递一个指向变量的指针a。然而:

callAMethood(a);

也是一个有效的调用,它传递存储在变量中的指针a。如果不知道会发生什么callAMethood,我们无法告诉您哪个是正确的呼叫。这同样适用于您的第二个示例。

高温高压

于 2013-06-13T02:39:53.747 回答
0

每个指针都可以void *隐式转换为。

编辑:

  1. 正如凯文所说,只有数据指针。

  2. 正如 CRD 所说,

答案是没有人能告诉你!

没有函数的信息callAMethood。所有这些调用在语法上都是有效的(可以编译),但是通常在语义上是无效的,除非callAMethood真的不关心哪种类型iVar(例如它只是打印指针)。

于 2013-06-13T02:03:25.377 回答
0

上面人们所说的是正确的,但您也可以使用 UTF8String 从 NSString 获取 const char *

const char * myStr = [a UTF8string];
callMehtod(myStr);

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

于 2013-06-13T03:30:31.757 回答