0

我正在玩objective-c并进行了样本测试。在非弧环境中,我有以下代码:

NSNumber * one;
NSLog(@"At first one retain count is: %d",[one retainCount]);

one = [[NSNumber alloc]initWithInt:5];
NSNumber * two = [[NSNumber alloc]initWithInt:1];
NSNumber * three =[[NSNumber alloc]initWithInt:2];

NSLog(@"After initializing %d",[one retainCount]);

NSMutableArray * array = [NSMutableArray arrayWithObjects:one,two,three, nil];
NSLog(@"After adding to array it is: %d",[one retainCount]);

NSString * a = [array objectAtIndex:0];
NSLog(@"Assigning to variable a: %d",[one retainCount]);
NSLog(@" %@ ",a);
[one release];
[array removeObjectAtIndex:0];
NSLog(@"after releasing and removing from array %d",[one retainCount]);
NSLog(@" %@ ",a);

似乎我无法使用 nslog 变量 a 但我可以做到。我得到以下输出;

2013-03-07 17:57:09.706 采访[33491:11303] 首先保留计数为:3
2013-03-07 17:57:09.707 采访[33491:11303] 初始化后 2
2013-03-07 17: 57:09.707 采访[33491:11303] 添加到数组后为:3
2013-03-07 17:57:09.707 采访[33491:11303] 分配给变量 a:3
2013-03-07 17:57:09.707 采访[33491:11303] 5
2013-03-07 17:57:09.707 采访[33491:11303] 释放并从阵列 1 中删除后
2013-03-07 17:57:09.708 采访[33491:11303] 5

即使我应该解除变量 a ,我怎么可能仍然使用它?

4

3 回答 3

3

你会被告知很多次你不应该使用retainCount,但你的问题是:

即使我应该解除变量 a ,我怎么可能仍然使用它?

当一个对象被释放时,这仅仅意味着用于它的内存被添加到可用内存池中。之前使用的内存没有被完全覆盖以删除其中存储的所有痕迹。

此外,当您调用[one release]它时,仅表明您不再对存储在其中的值所引用的对象感兴趣one(并且因此对象的内存可能会返回到空闲池),它不会改变存储在one自身中的值。所以在调用之后one仍然包含对对象所在位置的引用,或者仍然是......

如果您希望确保不使用过时的参考,您可以使用如下代码:

 [one release]; one = nil;

最后,您在分配对象之前报告您的第一个NSLog输出:

2013-03-07 17:57:09.706 Interview[33491:11303] At first one retain count is: 3

当你甚至从未分配过一个对象时,你怎么能拥有 3 的保留计数?答案是你很幸运你的代码没有崩溃;当一个局部变量(您one看起来是这样)被创建时,它以垃圾内容开头 - 调用使用该垃圾作为对象引用的方法是不明智的。请记住,Objective-C 不是一种“安全”的语言,不会保护您免受此类错误的影响。请注意,实例和全局变量被初始化为 0/nil,并且在 Objective-C 中支持在 nil 上调用方法——您只需返回 0。

于 2013-03-08T00:55:55.403 回答
2

因为您永远无法完全确定您的对象没有保留在框架的其他地方。确保您遵守内存管理策略,并让框架担心它的义务。

此外,不要使用retainCount. 苹果明确告诉你不要使用它,并且不保证说实话。

直接来自文档不要使用这种方法。

特别注意事项

这种方法在调试内存管理问题时没有任何价值。因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能在一个对象上保存了任何数量的延迟释放,所以您不太可能从中获得有用的信息方法。

要了解您必须遵守的内存管理的基本规则,请阅读“<a href="https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#/ /apple_ref/doc/uid/20000994" rel="nofollow">内存管理策略”。要诊断内存管理问题,请使用合适的工具:

于 2013-03-08T00:09:58.167 回答
2

看这里,这更清楚地解释了一切:

http://www.whentouseretaincount.com

于 2013-03-08T00:58:12.587 回答