目标C与C中的指针行为

弗雷德·汉密尔顿

我正在通过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的值或不分配任何额外的内存,那有什么用呢?

i_am_jorf

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

您已经声明currentTimeNSDate应该声明对象的指针您问题的答案在于做什么[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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章