【问题标题】:Use of * in Objective C Syntax在 Objective C 语法中使用 *
【发布时间】:2010-04-10 19:31:43
【问题描述】:

我在一些客观的 c 语法上有点挣扎。有人可以详细说明 * 在以下实例方法中的用法。

- (IBAction)sliderChanged:(id)sender{
    UISlider *slider = (UISlider *)sender;
}

我意识到我们正在创建一个类型为 UISlider 的变量,然后在将其转换为 UISlider 后将其设置为 sender。但是,我不明白 * 的用途和原因

UISlider slider = (UISlider)sender; 

不会工作。

【问题讨论】:

标签: objective-c


【解决方案1】:

*,就像在 C 中一样,在类型中使用时表示指针(例如您的情况)并取消引用指针。

指针只是一个变量,它包含其他东西的内存地址,在您的示例中是 UISlider 对象。

所以在你的例子中,

UISlider *slider = (UISlider *)sender;

slider 是 UISlider * 类型,或者是一个指向 UISlider 对象的指针。

以下关于 C 中指针的教程也适用于 Objective-C: Everything you need to know about pointers in C

【讨论】:

    【解决方案2】:

    所有 Objective-C 对象都必须使用指针来引用,因为它们位于堆上而不是栈上。

    【讨论】:

      【解决方案3】:

      您正在创建一个名为滑块的变量,其类型为 UISlider*,即指向 UISlider 的指针。

      您正在将 sender 的值分配给变量滑块,它是一个指向 Objective C 对象的指针的 anid,以便滑块和发件人指向同一块内存。

      在 Apple 的 Objective C 中,所有对象都在堆上声明并通过指针访问。

      【讨论】:

      • 只是为了确保我得到它.... 在 UISlider *slider = (UISlider *)sender;滑块和发送者都是指向内存中相同位置的指针?
      • 是的,你是对的。重要的是要记住“驻留在内存中的对象”和“指向它们的指针”之间的区别。
      【解决方案4】:

      我认为混淆是由于在以下方面使用 (id) 引起的:

      - (IBAction)sliderChanged:(id)sender{
          UISlider *slider = (UISlider *)sender;
      }
      

      Objective C 有一个 id 类型,它或多或少等同于 (NSObject *)。它本质上可以指向任何类型的 Objective C 对象。所以,实际上上面的代码是:

      - (IBAction)sliderChanged:(NSObject*)sender{
          UISlider *slider = (UISlider *)sender;
      }
      

      或多或少。由于我们(程序员)知道发送者对象是一个 UISlider,所以我们在将其值分配给 UISlider *slider 时将对象转换为 (UISlider*)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多