代码之家  ›  专栏  ›  技术社区  ›  averydev

iOS内存管理:ivars、static和nsstrings

  •  0
  • averydev  · 技术社区  · 14 年前

    我已经设法让自己对内存管理的一些元素感到困惑。我对Objective-C和内存管理语言比较陌生。

    我已经阅读了内存管理指南,但是我仍然对一些事情感到困惑。 1)是否需要清除任何对象未保留的ivar和方法变量。例如

    -(void) someMethod{
    int count = 100;
     for (int i=0; i <count;  i++) {
      NSLog(@"Count = %d", i);
     }
        }    
    

    方法完成后,“count”变量会发生什么? 如果一个方法分配了许多临时变量,那么只要这些临时变量不是未释放的、已分配的对象,它们是否会从内存中删除?或者我需要在某种程度上把它们设为零吗?

    2)如果我有一个静态变量,例如nsstring,那么当类被解除锁定时,我是否需要为从内存中删除该变量做些什么?

    3)我注意到nsstring的重取计数似乎为2147483647,维基百科告诉我这是32位有符号整数的最大值。

    http://en.wikipedia.org/wiki/2147483647

    myString retainCount = 2147483647
    
    -(void) someMethod{
    NSString *myString = @"testString";
    NSLog(@"myString retainCount = %d", [myString retainCount]);
    // logs:  myString retainCount = 2147483647
    }
    

    在这个方法的最后会发生什么?这个记忆会被清空吗?字符串未被任何对象引用。我的理解是nsstring的@“”便利方法返回一个autoreleased对象,但是自动releasing具有2147483647的重新计数的东西有什么意义呢?在这种情况下,保留或释放任何nsstring的意义是什么?

    我很清楚重新计算应该被忽略,但它只是让我不知道这里发生了什么。

    4)这有关系吗?我知道与nsstring相关联的内存不太值得写,但是我想成为一个优秀的内存管理公民,我对最佳实践比其他任何东西都更感兴趣。

    3 回复  |  直到 14 年前
        1
  •  5
  •   Lou Franco    14 年前

    RETAIN/RELEASE仅适用于对象,而不适用于int、bool、float、double或其他内置项。所以用它来 id 或者其他类,其中包含指向对象的指针。在您的示例中,计数不需要保留或释放。它被分配到堆栈上,当函数返回时,堆栈会自动清除。

    您需要处理任何本地对象 alloc . 这些是在retaincount设置为1的情况下创建的,因此您需要保留它们以备将来使用,或者释放它们。大多数cocoa函数(不以copy或alloc开头)返回一个自动释放的对象。这意味着它们将在以后调用release——只有在调用retain时,才能在函数之后保存它们。如果你想清理它们,你不需要做任何事情(调用release会导致太多的释放调用)。

    如果有一个静态变量指向一个对象,那么当释放该类的对象时,它不会被触碰。如果你想释放它,你必须调用释放。如果静态是in t、bool或其他内置的,则不能(不能)对其调用release。这是应用程序全局内存的一部分。

    设置为字符串文本的nsstring不应调用release。对他们来说,重新计算是毫无意义的。对于有符号的int值,该值也是-1。

    如果你这样做-- [[NSString alloc] initCallHere:etc] --你得打电话叫释放。大多数情况下,当你得到字符串时,你不使用alloc,所以你不需要调用release。如果您保留了一个,您需要调用release。

    是的,这很重要。随着时间的推移,漏洞会导致iPhone扼杀你的应用程序。

        2
  •  2
  •   Jorge Israel Peña    14 年前
    1. 你不用担心 count 因为它是一个整数,一个原始数据类型,而不是一个对象。

    2. 我已经读过了,这些只是在应用程序终止或者你明确地释放它们时就消失了。

    3. 你说得对,你应该 以这种方式担心保留计数。可可自动给予 @"" ( NSConstantString 对象)绝对最高保留值,因此不能取消分配。

    4. 你把话题弄得太复杂了。重点 指导原则是让您知道,在三种特定情况下,您只需要担心内存管理。苹果给了你这些指导方针,这样你就不必担心每个类的具体内部结构(比如手动跟踪) retainCount ,更不用说可可有时做的事情是不同的(比如 nsconstantstring公司 )只要你记住这些指导原则,你就不必知道下面发生了什么(当然,对保留计数概念的理解有助于帮助,但将其与手动跟踪的方法进行比较)。

    我不知道你具体读哪本指南,但如果你没有给 this one 试试看,我强烈推荐。它以简洁和直接的方式总结了这三个准则。

        3
  •  2
  •   hotpaw2    14 年前

    cocoa内存管理规则只覆盖目标C对象。

    当任何子例程或方法退出时,局部变量(非静态)将被清除(实际上堆栈内存只是被同一线程中的后续子例程或方法重用/覆盖)。需要内存(字符串)和静态变量的常量在应用程序退出后被操作系统删除时会被清除。当您手动释放malloc的内存时,它会被清除。

    但是,您分配或保留的任何对象(无论是分配给IVAR、本地、全局、静态等)都必须像其他对象一样进行管理。小心地将对象分配给全局变量,除非您真正擅长保留计数管理。