我有一个方法,它采用以下参数。
void callAMethood(const void *iVar){}
现在在这里我不清楚我应该如何指针
以下似乎很简单,我只是传递地址而不是值。
NSString *a=@"Hi";
callAMethood(&a);
但是,以下似乎效果很好,但理解语法很困难。
char const * const a="HI";
callAMethood(&a);
甚至这也有效callAMethood(a);
我有一个方法,它采用以下参数。
void callAMethood(const void *iVar){}
现在在这里我不清楚我应该如何指针
以下似乎很简单,我只是传递地址而不是值。
NSString *a=@"Hi";
callAMethood(&a);
但是,以下似乎效果很好,但理解语法很困难。
char const * const a="HI";
callAMethood(&a);
甚至这也有效callAMethood(a);
正如 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
目的。
你问你应该传递给函数什么(它不是方法的声明):
void callAMethood(const void *iVar) {...}
答案是没有人能告诉你!
您的函数采用类型的值void *
- 这种类型通常在 C 中用于表示“指向任何东西的指针”。它不是一种用于将指针指向任何对象的函数的类型,即id
.
但这并没有让我们走得太远,因为我们不知道callAMethood
期待什么我们不知道要通过什么 - 我们无法告诉你答案。
现在你举个例子:
NSString *a = @"Hi";
callAMethood(&a);
这是一个有效的调用,它传递一个指向变量的指针a
。然而:
callAMethood(a);
也是一个有效的调用,它传递存储在变量中的指针a
。如果不知道会发生什么callAMethood
,我们无法告诉您哪个是正确的呼叫。这同样适用于您的第二个示例。
高温高压
每个指针都可以void *
隐式转换为。
编辑:
正如凯文所说,只有数据指针。
正如 CRD 所说,
答案是没有人能告诉你!
没有函数的信息callAMethood
。所有这些调用在语法上都是有效的(可以编译),但是通常在语义上是无效的,除非callAMethood
真的不关心哪种类型iVar
(例如它只是打印指针)。
上面人们所说的是正确的,但您也可以使用 UTF8String 从 NSString 获取 const char *
const char * myStr = [a UTF8string];
callMehtod(myStr);