我正在通过Big Nerd Ranch的Objective C编程(第二版)进行工作,只是在第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的值或不分配任何额外的内存,那有什么用呢?
为什么不将第二个日期的数据写入用于第一个日期的存储位置(地址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);
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句