【问题标题】:pass pointer to method in Objective-C将指针传递给 Objective-C 中的方法
【发布时间】:2012-12-11 06:24:00
【问题描述】:

大家圣诞快乐:)

我有一个指针问题。虽然我熟悉指针概念,但到目前为止,我还没有在 Objective-C 中使用过指针,就像这里描述的那样。

我是这样修改的:

  int countSInteger = 10;

  [self setHMSValues:countSInteger];

- (void) setHMSValues: (int*) timeCat {
  *timeCat = *timeCat - 1;
}

但现在我收到了 EXC_BAD_ACCESS:

任何圣诞老人的暗示?

来自瑞士的问候,罗纳德·霍夫曼

【问题讨论】:

  • 可能是这样,但我在其他语言中使用指针已有 20 多年了,我没有遇到任何问题。我的问题显然出在 Objective-C 中。
  • 如果您要将变量声明为int 并且参数是int *,则需要传递&countSInteger
  • 这不是 Objective-C 独有的,你在 C 或 C++ 中也会遇到同样的问题。
  • @Cory:好的,你是对的。但我不久前开始使用 C/C++ 和 Objective-C。而且除了C方言之外,还有其他语言。

标签: objective-c pointers methods


【解决方案1】:

您似乎希望setHMSValues: 计算并返回整数参数的值。但是,该参数是一个指向 int (int *) 的指针,而您传递的是一个普通的 int,其值为 10。因为指针本身就是整数值(整数值表示内存地址),代码试图将值设置在内存位置10;因此,您会收到“错误访问”错误,因为您的程序无法访问或更改内存位置 10 的值。

你应该做的是将countSInteger地址传递给方法:

[self setHMSValues:&countSInteger];

但是,有一个更好的方法可以做到这一点。由于您只从该方法返回一个值,因此不需要 out 参数。您可以将方法更改为:

- (int) setHMSValues: (int) timeCat {
  return timeCat - 1;
}

然后这样称呼它:

int countSInteger = 10;

countSInteger = [self setHMSValues:countSInteger];

【讨论】:

  • 是的,成功了。非常感谢。正如我在最初的帖子中所说,这是简化的。实际上三个参数被传递给选择器。但是return只返回一个值。
  • 我可能会指出Objective-C convention dictates 以“set”开头的实例方法将用作设置实例变量的访问器。我会重命名该方法。
【解决方案2】:

试试:

- (void) setHMSValues: (int*) timeCat {
*timeCat = *timeCat - 1;
}

【讨论】:

  • 你在这里美化了一个更大的问题。他在不需要的地方使用指针。
  • 好的,在我使用 int* 之前我尝试过没有 * 但没有成功。
  • 我修改了最初的帖子,因为在使用您的建议时我收到了 EXC_BAD_ACCESS。
  • 请使用-=。我讨厌看到长形式的减法。
  • @FiCoda 好吧,我不讨厌它。而且绝对比 -=
【解决方案3】:

countInteger”被声明为“int *”,而您调用的方法需要一个“int”。

如果您将“countInteger”声明为普通的“int”,您不认为您可能会有更好的运气吗?

【讨论】:

    【解决方案4】:

    为什么要使用 int 指针?只需删除 *

    【讨论】:

    • 也许他想要一个 int out 参数。
    【解决方案5】:

    Objective-C 是否支持使用 & 像 C++ 一样通过引用传递?我没有专门检查过 Objective-C,(从来没有需要)但在 C++ 中,以下内容用于告诉编译器使用 pass-by-reference:

    void count(int &var);
    

    【讨论】:

    • 和 C 一样,Objective-C 没有引用参数。
    • 太可惜了,让我混淆 C 和 C++ 语义……修复……修复
    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多