【问题标题】:Difference between an object and a pointer对象和指针的区别
【发布时间】:2011-11-18 22:05:50
【问题描述】:

正如标题所说,指针和对象有什么区别。

假设我有这个代码..

NSString *red = [[NSString alloc]initWithFormat:@"%@"];

还有这段代码..

NSString *blue = [NSString stringWithFormat:@"%@"];

假设它们都是指向对象的指针并且几乎相同是否正确?如果是这样,我应该如何思考我脑海中的对象?

如果答案已经存在,我深表歉意,我确实使用了搜索功能,但我只在 C++ 语言中找到了这方面的示例,并想确定它在 Objective-c 中的情况。

【问题讨论】:

  • 你展示的两个例子做同样的事情,我相信。第二个是一种方便的方法,可以让您从第一个开始编写和管理分配。

标签: objective-c object pointers


【解决方案1】:

除了 Basile Starynkevitch 和 Bram 的回答,

在目标 C 中,您的代码行之间的区别是,

NSString *red = [[NSString alloc]initWithFormat:@"%@"];

**上面的代码说你拥有红色对象,所以你有责任释放它。

NSString *blue = [NSString stringWithFormat:@"%@"];

**你不拥有它,你的程序内部的其他人将拥有它,你不必释放它。

我建议阅读 Apple 的文档以获取更多信息,这很棒!特别学习,《Objective C 编程指南》

祝你好运!

PS:iOS 5 有新功能,内存管理由 iOS 自己完成,现在开发者可以更有创意,而不是做 3 年级的引用计数数学 :)

【讨论】:

  • 这两行代码在我看来一模一样,我是不是漏掉了什么?
  • 正确对不起!!那不是故意的:)
  • 谢谢大家,我明白了 :) 非常感谢。
  • 有什么理由不赞成这个答案吗?
【解决方案2】:

指针是一个 C 概念,它们在 C、C++ 和 Objective-C 中是相同的。它们只是一个整数,用于保存存储对象的内存地址。在您的示例中,这两条消息都动态创建了一个 NSString object。该对象存储在应用程序内存中的位置由操作系统决定,您真的不在乎。所以操作系统分配了一些内存并在其中存储了一个 NSString 的实例。然后它会返回一个指向该对象的指针,您可以在以后使用它来引用实际的对象。

【讨论】:

    【解决方案3】:

    指针包含存储对象的内存地址。

                  Memory address    Object
                  --------------    ---------
                  0
                  1
                  2
                  3
                  4
                  ...
    pointer ----> 10523             myObject1
                  10524
                  ...
    

    【讨论】:

      【解决方案4】:

      对象是类的实例。它会占用内存,并且应该在完成后释放。指针是您对对象的引用。

      NSString *red = [[NSString alloc]initWithString:@"red"];
      

      还有这段代码..

      NSString *blue = [NSString stringWithString:@"blue"];
      

      red 和 blue 都是指向不同对象的指针。 这里重要的区别是红色是你的,蓝色不是

      [[NSString alloc]initWithString:@"red"];z

      返回一个您拥有并必须稍后释放的对象

      [NSString stringWithString:@"blue"]; 返回一个不属于你的对象,将在下次自动释放池清空时释放

      这些概念在苹果的The Objective-C Programming Language 指南中有所介绍(我向您指出了具体部分,它是一个巨大的文档,但“对象、类和消息传递”部分应该对您的问题最有帮助)

      【讨论】:

        【解决方案5】:

        我希望我能把这个更清楚。

        对象在内存中。指针就像指向对象所在内存的箭头。

        将其视为建筑物的方向标志。建筑物是对象,方向是指针。

        【讨论】:

          【解决方案6】:

          (我不是 Objective C 专家,但是)

          将对象想象成内存区域,指针指向该区域但不是该区域。

          粗略的类比:你的车牌号不是你的车。数字是一个数字(由数字组成,或更抽象地说是自然集合中的一个元素)。汽车是你驾驶的东西。

          【讨论】:

            【解决方案7】:

            也不是 Objective-C 专家。这是我的最佳猜测。

            这两种类型似乎都是指针。但是,看起来不同之处在于第一个(您使用 alloc 的地方)让您负责相关的内存。

            对于第二种类型,如果您实例化对象,使用它,无论如何,然后它超出范围,操作系统可能会为您清理它。但是,对于第一种类型,您负责将分配的内存释放回操作系统。

            我猜测 Objective-C 内置了某种引用计数和内存管理来检测该对象何时不再被任何地方引用,但重要的部分是该对象应该在该声明的范围之外持续存在只要您在某处仍有参考资料。

            阅读这篇文章你可能会发现很多信息:Objective-C pointers?

            就“对象”和“指针”的一般定义而言:这两种类型都是指针。一个你负责内存,另一个操作系统负责你。一个对象被简单地定义为一个类的一个实例。指针是该实例的内存地址。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-07-19
              • 2011-03-14
              • 2011-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-11
              相关资源
              最近更新 更多