Objective c 对象被释放,但它们仍然给出了它们的值。弧未标记(表示关闭)

Objective c 对象被释放,但它们仍然给出了它们的值。弧未标记(表示关闭),objective-c,copy,release,retain,Objective C,Copy,Release,Retain,对象被释放,但它们仍然给出了它们的值。电弧未标记(表示关闭) ==输出=== 2012-12-14 15:04:01.165测试毫米[940:207]11111 2012-12-14 15:04:01.168测试毫米[940:207]S1-弦1 S2-1 数组-S1-String1 S2-1 数组-首先,访问解除分配的对象是未定义的行为。它可能会访问看起来像原始对象的东西(如果它使用的内存没有被覆盖),或者它可能会访问另一个对象(后来碰巧在那里分配),或者它可能会访问随机垃圾(根本不是对象),或

对象被释放,但它们仍然给出了它们的值。电弧未标记(表示关闭)

==输出===

2012-12-14 15:04:01.165测试毫米[940:207]11111 2012-12-14 15:04:01.168测试毫米[940:207]S1-弦1 S2-1 数组-S1-String1 S2-1
数组-

首先,访问解除分配的对象是未定义的行为。它可能会访问看起来像原始对象的东西(如果它使用的内存没有被覆盖),或者它可能会访问另一个对象(后来碰巧在那里分配),或者它可能会访问随机垃圾(根本不是对象),或者它可能会崩溃或做其他奇怪的事情。无法判断对象是否已解除分配,除非您在运行时启用了zombies以捕获对解除分配对象的调用

不仅如此,即使在您释放对象上的所有保留后,也无法保证对象何时被释放。当对象的保留计数变为0时,将取消分配该对象。但是,即使您分配并释放了一个对象,也有可能是某些API保留了它,然后自动释放了它。e、 g.您分配并立即释放数组,但在
initWithObjects:
中,它可能保留并自动释放自己(保留并自动释放对象从来都是正确的),尽管在
init
中不太可能这样做

特别是在本例中,对于字符串,
@“String1”
是一个存在于静态内存中的文本字符串,对其执行的内存管理操作如
保留
释放
什么都不做
NSString
,基于常量字符串创建新字符串时,只需返回该常量字符串;对常量字符串执行
copy
,也会返回该常量字符串。所以基本上
s1
s2
都指向静态内存中永远存在的字符串文本<代码>释放对它们没有影响。(但从内存管理规则的角度来看,它们仍然是不正确的。)

阵列
已分配并释放。这里可能发生的情况(我猜,由于上述原因)是数组确实被释放了,但在打印时,这部分内存没有被覆盖,因为时间很短。同样,这是未定义的行为

-(void)viewDidLoad
{   
     [super viewDidLoad];

     // Do any additional setup after loading the view, typically from a nib.
     //test of retain and copy

      NSString *s1 = [[NSString alloc] initWithString:@"String1"];
      NSString *s2 = [s1 copy];

      [s1 release];
      [s1 release];
      [s2 release];

      if(s1!=nil)
      {
            NSLog(@"11111");
            NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
            [array release];

            NSLog(@"S1 - %@ \n S2 - %@ \n Array - %@",s1,s2,array);
       }
  }