多个分配和nil指针分配内存概念

时间:2014-01-14 17:23:01

标签: ios objective-c automatic-ref-counting

  1. 多次分配init对象时会发生什么?
  2. 例如:

    {
      nssstring * samplestring ;
      samplestring = [[nsstring alloc]init];
      samplestring = [[nsstring alloc]init];
    }
    

    在执行此代码block后,第一次分配时samplestring指向的内存地址是否泄漏?

    这是正常还是不良编码做法。 在执行此块操作后,ARC如何处理第一个内存分配。

    2.以上代码如何与

    不同
    {
      nssstring * samplestring;
      samplestring = [[nsstring alloc]init];
      samplestring = nil;
    }
    

    Nil是一个对象。对 ?因此,似乎第一个samplestring内存分配的行为与1中的代码块类似。或nil在内存管理中具有特殊意义。

    最后,如果我想使用相同的对象名,我应该遵循1或2。

    我正在通过手机询问这个问题,请原谅格式化,如果这是重复的话。

2 个答案:

答案 0 :(得分:2)

对于1,当您重新分配对象指针时,ARC将销毁旧对象。同样,如果对象超出范围,它将被销毁

{
    NSString * samplestring ;
    samplestring =[ [nsstring alloc]init];    // first object created
    samplestring =[ [nsstring alloc]init];    // first destroyed, second created
}    // second object destroyed

对于2,这几乎是相同的故事,除了当符号超出范围时没有什么可以破坏:

{
    NSString * samplestring;
    samplestring =[ [nsstring alloc]init];    // first object created
    samplestring =nil;                        // first object destroyed
}

至于最后如果我想使用相同的对象名称,我应该遵循1或2。,这并不重要,但是2.由于ARC将正确管理对象生存期,因此是多余的

最后,nil不是一个对象,它是一个 nil指针,即一个指向任何东西的指针。

答案 1 :(得分:1)

如果您使用ARC,那么这两种情况都不会泄漏。

在第一个示例中,您将创建一个指针。然后在内存中创建一个对象并告诉指针指向它。然后在内存中创建另一个对象(在不同的内存位置)并告诉指针指向它。 ARC将看到没有任何内容指向第一个分配,并将内存位置标记为垃圾和可重用。 ARC根据指向或不指向对象(retian计数为1或更多)为您添加retain]release调用。

你的第二个例子几乎是一样的。你创建一个指针。然后你创建一个对象并告诉指针指向它。然后你告诉指针指向什么(零)。此时,您没有指向您创建的内存位置,ARC看到并将内存标记为垃圾/可重用。

在某些方面,第二个示例更好,因为当您使用xcode运行analyze时,它会看到您将指针设置为nil,并且在没有重新分配的情况下进一步使用它将被标记为错误(如果它们不会导致您的应用程序崩溃的第一个位置)。但这确实是一个意见问题。

相关问题