Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 理解内存管理_Ios_Objective C_Memory Management_Retain - Fatal编程技术网

Ios 理解内存管理

Ios 理解内存管理,ios,objective-c,memory-management,retain,Ios,Objective C,Memory Management,Retain,我试图更好地理解Objective C中的内存管理(没有ARC)。 目前创建简单的程序来尝试使用它 我的代码 ... //create some object RetainTracker * rt = [RetainTracker new]; //RC=1 NSLog(@"Just created - %lu", (unsigned long)[rt retainCount]); [rt retain]; // RC=2 NSLog(@"%lu", (unsigned long)[rt reta

我试图更好地理解Objective C中的内存管理(没有ARC)。 目前创建简单的程序来尝试使用它

我的代码

...
//create some object
RetainTracker * rt = [RetainTracker new]; //RC=1
NSLog(@"Just created - %lu", (unsigned long)[rt retainCount]);
[rt retain]; // RC=2
NSLog(@"%lu", (unsigned long)[rt retainCount]);
[rt release]; //RC=1
NSLog(@"%lu", (unsigned long)[rt retainCount]);
[rt release]; //RC=0 -> call to dealloc    
//call to object rt again after it was deallocated and get RC=1
NSLog(@"%lu", (unsigned long)[rt retainCount]); //think that here must be exception ?
结果:

所以,在结果中,我们可以看到,在我释放最后一个引用之后,引用计数器仍然等于1,对于对象rt

我更深入,用仪器调查这个物体的“生命”,得到下一个

据我了解:

  • 步骤0-仅创建-RC=1
  • 步骤1-对于代码
    [rt retain]
    -RC=2
  • 步骤3-对于代码
    [rt release]
    -RC=1
  • 步骤4-对于代码
    [rt release]
    -RC=0

所以,对象必须被解除分配,但如果在步骤4之后调用
[rt retainCount]
,则该对象的RC仍然等于1。为什么?可能我犯了什么错误或错过了什么?

当池中的retain count为0时,对象被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么

更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)”

下面是:“……你不太可能从这个方法中得到有用的信息”


retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。

当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么

更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)”

下面是:“……你不太可能从这个方法中得到有用的信息”


retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。

当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么

更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)”

下面是:“……你不太可能从这个方法中得到有用的信息”


retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。

当池中的retain count为0时,对象将在池中被释放。释放对象后,该对象可能仍在内存中。尝试在下一次排水后进入,看看会发生什么

更新: 对我的错误。由于某种原因,我错过了它没有自动释放的事实。然而,我在研究retainCount方法时,在文档中发现了这样一个问题:“不要使用此方法(必选)”

下面是:“……你不太可能从这个方法中得到有用的信息”


retainCount方法似乎不能可靠地为您提供对象的retain计数。但是,仍然很奇怪,您甚至可以将该消息发送到假定已释放的对象。

在对象解除分配后,使用指向该对象的指针会导致未定义的行为。也就是说,它可以打印1,42,你的程序可能会崩溃,Hello Kitty可能会出现在你的电脑上;任何事情都有可能发生。任何行为都是与未定义的行为一致的,即使是似乎表明正在发生其他事情的行为

除了这是未定义的行为之外,你所看到的很可能是基于你所做的。对象解除分配后,其内存被标记为可供使用,但构成内存中对象的字节仍保留在内存中。因此,在当前时间内,它很可能没有被其他内容覆盖,并且内存仍然“看起来”像被释放的对象,并且向它发送消息(尽管未定义行为)很可能会成功,因为它只是使用对象中仍然在内存中正确位置的部分


关于保留计数,您假设当您
释放它时,保留计数(无论它存储在内存中如何)将始终递减,因此如果在
释放之前它是1,之后它应该是0。但是,当retain count为1时,他们不必这样做,因为他们知道当您
释放retain count为1的对象时,该对象将被解除分配,之后您无论如何都不应该使用该对象,因此在这种情况下,他们可能会跳过递减,因为更新不再使用的变量没有意义。

对象解除分配后,使用指向该对象的指针会导致未定义的行为。也就是说,它可以打印1,42,你的程序可能会崩溃,Hello Kitty可能会出现在你的电脑上;任何事情都有可能发生。任何行为都是与未定义的行为一致的,即使是似乎表明正在发生其他事情的行为

除了这是未定义的行为之外,你所看到的很可能是基于你所做的。对象解除分配后,其内存被标记为可供使用,但构成内存中对象的字节仍保留在内存中。所以在当下