Objective C与C中的指针行为

时间:2015-01-31 19:56:19

标签: objective-c

我正在通过Big Nerd Ranch的 Objective C编程(第2版),并在第15章(对象和内存)中遇到了这个例子:

NSDate *currentTime = [NSDate date]; //currentTime points to date object at some address ("A")
NSLog(@"currentTime's value is %p.\n", currentTime);

sleep(2);

currentTime = [NSDate date]; //currentTime now points to date object at different address ("B")
NSLog(@"currentTime's value is now %p.\n", currentTime);[/code]

我想了解为什么currentTime在分配了新日期时从地址A变为地址B.为什么不将第二个日期的数据写入第一个日期(地址A)的内存位置?

这个c代码(编辑:这是令人尴尬的糟糕,但我将按照原始编写的方式离开,以便评论/答案有意义):

int *i = 10;
i = 12;

不会更改& i的值或分配任何额外的内存,所以给出了什么?

2 个答案:

答案 0 :(得分:3)

  

为什么不将第二个日期的数据写入第一个日期(地址A)使用的存储位置?

您已将currentTime声明为指向NSDate对象的指针,正如您所希望的那样。你的问题的答案在于[NSDate date]的作用。它在NSDate.h中声明为:

@interface NSDate (NSDateCreation)
+ (instancetype)date;
...

这些标记为返回instancetype的类方法表明该方法在概念上是工厂方法。在这种情况下,它是[[NSDate alloc] init]的简写。 alloc为新对象分配内存,init初始化它。

因此,当您为NSDate指针指定一个新值时,会隐式释放旧对象(因为,您可能正在使用ARC并且您将currentTime声明为隐式强引用)并且指针被更新为指向新创建的对象。

这与C指针的行为方式不应有任何不同。它类似于:

CDate *currentTime = malloc(sizeof(CDate));
CDate_Initialize(currentTime);

sleep(2);

free(currentTime);
currentTime = malloc(sizeof(CDate));
CDate_Initialize(currentTime); 
...

答案 1 :(得分:0)

[NSDate date]; 定义分配一个新地址,您指定给 currentTime 第二次指定它覆盖其第一个值