从nsarray中删除打印元素

时间:2013-03-07 23:59:36

标签: objective-c memory-management

我正在玩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?

3 个答案:

答案 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)

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

http://www.whentouseretaincount.com