我正在玩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从阵列1中释放和删除后采访[33491:11303] 2013-03-07 17:57:09.708采访[33491:11303] 5
即使我认为它已被废除,我仍然可以使用变量a?
答案 0 :(得分: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。
答案 1 :(得分:2)
因为您永远无法完全确定您的对象未在框架中的其他位置保留。确保遵守内存管理策略,让框架担心其义务。
此外,请勿使用retainCount
。 Apple明确告诉你not to use it,并不能保证说实话。
直接来自documentation:请勿使用此方法。
特别注意事项
此方法在调试内存管理问题时没有任何价值。因为任何数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能在对象上保留任意数量的延迟版本,所以您不太可能从此获取有用信息方法
要了解您必须遵守的内存管理的基本规则,请阅读“Memory Management Policy”。要诊断内存管理问题,请使用合适的工具:
- 即使在运行程序之前,Clang Static analyzer通常也会发现内存管理问题。
- Instruments应用程序中的Object Alloc仪器(请参阅Instruments User Guide)可以跟踪对象分配和销毁。
答案 2 :(得分:2)
看这里,这更清楚地解释了一切: