我正在通过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的值或分配任何额外的内存,所以给出了什么?
答案 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 第二次指定它覆盖其第一个值