2010-09-03 170 views
0

我已经设法让自己对内存管理的某些元素感到困惑。我对于Objective-C和内存管理语言一般都陌生。iOS内存管理:ivars,静态和NSStrings

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

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

该方法完成后,“count”var会发生什么变化? 如果一个方法分配了大量的临时变量,那么只要它们没有未发布,alloc'd对象,那么这些变量是否会从内存中移除?或者我需要以某种方式将它们设置为零? 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的@“”方便方法返回一个自动释放对象,但无论如何,使用retainCount来自动释放某些东西的意义何在?在那种情况下,保留或释放ANY NSString的意义何在?

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

4)这是否有这个问题?我知道与NSString相关的内存没有太多的可写的地方,但我想成为一名优秀的内存管理公民,而且我对最佳实践更感兴趣。

+3

实际上2147483647是* signed * 32位整数的最大值。它被Cocoa frammework用来表示一个不能被释放的常量对象。您创建的普通NSStrings具有更多常规保留计数。 – JeremyP 2010-09-03 21:06:37

+0

感谢您的澄清。问题编辑相应。 – averydev 2010-09-03 21:38:14

回答

5

保留/释放只对对象有效,而不是int,bool,float,double或其他内建。因此,将它用于id或其他持有指向对象的指针的类。在你的例子中,count不需要保留或释放。它被分配在堆栈上,当函数返回时它会自动清理。

您确实需要处理任何本地对象alloc。这些都是使用设置为1的retainCount创建的,因此您需要等待稍后或释放它们。大多数Cocoa函数(不以copy或alloc开头)返回一个自动释放的对象。这意味着他们将在稍后发布对他们的发布 - 如果您对它们调用retain,则只能在该函数后面保留这些发布。如果你希望清理它们,你不需要做任何事情(调用释放会导致太多的释放调用)。

如果您有一个静态变量指向一个对象,那么当该类的对象被处理时,它不会被触摸。如果你想要它被释放,你必须调用它释放。如果静态是一个int,bool或其他内置的,那么你不能(不能)在它上面调用release。这是你的应用的全球记忆的一部分。

设置为字符串文字的NSString不应该具有对其调用的版本。 retainCount对他们来说毫无意义。对于signed int值,该值也是-1。

如果你这样做 - [[NSString alloc] initCallHere:etc] - 你必须调用它的释放。大多数时候你得到字符串,你不使用alloc,所以你不需要调用release。如果你保留一个,你需要调用release。

是的,它确实很重要。随着时间的推移,泄漏将导致iPhone杀死你的应用程序。

+0

感谢您的回答,那么使用@“”语法创建的字符串会保留在内存中,直到应用程序被终止?还是将它们放入池中进行清理,除非进一步保留? – averydev 2010-09-03 21:34:42

+1

“@”“字符串实际上是静态的 - 也就是说,应用程序的内存映像的一部分。你不需要清理它们(尽管它实际上并不重要,因为实际上它们具有无限的保留计数)。如果使用这样的字符串''alloc','copy'或'new'对象,那么您应该'释放'该对象。 – walkytalky 2010-09-03 21:41:13

+0

应用程序中@“”字符串的数量,例如大量日志语句或其他短期使用情况是否会影响应用程序的性能或显着增加其内存占用量? 如果短期使用字符串变量,使用@“”创建时它们的用处已经过期了吗? – averydev 2010-09-03 23:41:08

2
  1. 你不需要担心count因为它是一个整数,一个原始数据类型,而不是一个对象。

  2. 我读过那些只是在应用程序终止或如果你明确释放它们时才会消失。

  3. 你是对的,你应该不是担心这种方式的保留数。 Cocoa自动给予@""NSConstantString对象)绝对最高的保留值,以便它们不能被分配。

  4. 你已经过了复杂的主题。 三个准则的目的是让你知道你只需要担心在三种特定情况下的内存管理。 Apple为您提供这些指导方针,以便不必担心每个班级的具体内部情况(如手动跟踪retainCount),更不用说有时Cocoa会以不同的方式做事(如NSConstantString)。只要你记住这些指导方针,你就不必知道底下发生的事情的细节(当然,对保留数概念的理解有帮助,但将其与手动跟踪相比较)。

我不知道哪个引导你具体看,但如果你没有给this one一试,我强烈推荐它。它以简明和直接的方式总结了三条指导原则。

2

可可内存管理规则只覆盖Objective C对象。

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

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