正如标题所说,指针和对象之间有什么区别。
说我有这个代码..
NSString *red = [[NSString alloc]initWithFormat:@"%@"];
和这段代码..
NSString *blue = [NSString stringWithFormat:@"%@"];
假设它们都是指向对象的指针并且几乎相同,这是正确的吗?如果是这样,我应该如何看待脑海中的物体?
如果答案已经存在,我很抱歉,我确实使用了搜索功能,但我只是在C ++语言中找到了这个例子,并希望确定它在objective-c中的含义。
答案 0 :(得分:3)
除了Basile Starynkevitch和Bram的回答,
在目标C中,您的代码行之间的区别是,
NSString *red = [[NSString alloc]initWithFormat:@"%@"];
**上面的代码说你拥有红色物体,所以你有责任释放它。
NSString *blue = [NSString stringWithFormat:@"%@"];
**你没有拥有它在你的程序中的其他人内心深处将拥有它,你不必释放它。
我建议更多信息阅读Apple的文档很棒!特别学习,“目标C编程指南”
祝你好运!PS :iOS 5有新功能,内存管理由iOS本身完成,现在开发人员可以更有创意而不是做3级数学的引用计数:)
答案 1 :(得分:2)
指针是一个C概念,它们在C,C ++和Objective-C中是相同的。它们只是一个整数,用于保存存储对象的内存地址。在您的示例中,这两个消息都动态创建NSString 对象。该对象存储在您的应用程序中的内存由操作系统决定,您真的不在乎。因此操作系统会分配一些内存并在其中存储NSString的实例。然后它会返回一个指针到该对象,您可以使用它来在以后引用实际对象。
答案 2 :(得分:1)
对象是类的实例。它会占用内存,并且应该在完成后释放。指针是对象的引用。
NSString *red = [[NSString alloc]initWithString:@"red"];
和这段代码..
NSString *blue = [NSString stringWithString:@"blue"];
红色和蓝色都是指向不同对象的指针。 这里的重要性差异是红色由你拥有而蓝色不是
[[NSString alloc] initWithString:@“red”]; z
返回您拥有的对象并且必须稍后释放
[NSString stringWithString:@"blue"];
返回不属于您的对象,并在下次自动释放池清空时释放
这些概念在apple的The Objective-C Programming Language指南中有所介绍(我向您指出了特定的部分,它是一个巨大的文档,但“对象,类和消息”部分应该对您的问题最有帮助)
答案 3 :(得分:1)
指针包含存储在对象中的内存中的地址。
Memory address Object
-------------- ---------
0
1
2
3
4
...
pointer ----> 10523 myObject1
10524
...
答案 4 :(得分:0)
我希望我能更清楚地做到这一点。
对象在内存中。指针就像对象所在的内存的箭头。
把它看作是建筑物的指示牌......建筑物是物体,方向是指针。
答案 5 :(得分:0)
(我不是Objective C专家,但是)
将对象视为内存区域,指针指向区域但不是该区域。
总类比:你的车牌数不是你的车。数字是一个数字(由数字组成,或者更抽象地是一组自然元素)。汽车是你驾驶的东西。
答案 6 :(得分:0)
也不是Objective-C专家。这是我最好的猜测。
这两种类型似乎都是指针。但是,看起来不同的是第一个(你使用alloc的地方)让你负责相关的内存。
对于第二种类型,如果你实例化对象,使用它,无论如何,然后它超出范围,操作系统可能会为你清理它。但是,对于第一种类型,您负责将分配的内存释放回操作系统。
我猜这个目标-C内置了一些引用计数和内存管理来检测该对象何时不再被引用,但重要的是该对象应该超出该声明的范围只要你在某个地方仍然有参考。
您可以通过阅读以下帖子找到大量信息:Objective-C pointers?
就“对象”和“指针”的一般定义而言:这两种类型都是指针。一个是负责记忆,另一个是OS负责你。对象简单地定义为类的实例。指针是该实例的内存地址。