释放变量以节省内存

时间:2011-03-22 21:12:31

标签: iphone objective-c cocoa-touch

我有一个关于发布变量而不是浪费记忆的初学者的问题......

我不太明白何时发布变量。我明白如果我在头文件中分配它们(在我的@interface部分和我的@property命令中),我应该总是这样做。我在我的 - (void)dealloc函数中释放它们。

但是,我应该对我在某些方法中使用的变量做些什么,例如:

for (int temp = 0; temp < 3; temp++) {
    // do something...
}

[temp release];

这显然是错误的(至少xCode告诉我),因为'temp'是未声明的。但为什么?我已经宣布它是一个int和temp因此占用了我记忆中的空间,我敢肯定。我怎么告诉程序在我不再需要之后释放空间温度?我确信这是显而易见的,但我根本就没有得到它。

对于初学者如何不成为记忆猪以及在我的应用程序中到处都有“记忆泄漏”的任何建议,我会非常高兴...

8 个答案:

答案 0 :(得分:2)

您在循环范围内将其声明为int。循环完成后,它就会超出范围。

此外,您无法释放int,这是一种基本类型。您只能释放NSObject的子类。一个好的经验法则是你最终必须发布任何你称为alloc或retain的东西。

编辑:对于您的启发,内存管理仅适用于从堆分配的对象。那将是通过“alloc”获得的NSObject,或者必须使用类似“malloc()”的东西分配C级内存。声明像“int x”这样的变量被称为“自动”变量,因为它是在堆栈上创建的,并且会自动消失,然后该块结束(“块”的结尾是函数的结尾或者可能是结束一个{}对甚至是for / if / while块的结尾。

由于Objective-C基本上只是C(带消息)的特殊版本,因此它不会创建永久对象,除非您明确告诉它。这是不同的形式语言,如Python或Javascript。

答案 1 :(得分:2)

您只需要释放对象,而temp是一个int,而不是一个对象。

至于发布对象时,Apple的文档解释说比我更好:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

答案 2 :(得分:1)

您只释放对象,而不释放原始类型。例如,您使用

创建一个数组
NSArray *myArray = [[NSArray alloc] init];

这个初始化分配的内存,你完成使用你的阵列后你必须释放,这是你的责任,否则会有内存泄漏。您可以在控制器的dealloc部分或方法的末尾执行此操作,或者甚至在您通过数组枚举并且不再需要它之后执行此操作。

如果使用除alloc,copy或new(很少使用)之外的其他方法创建对象实例,则必须释放它们。如果你打电话给自己保留一个对象,你也必须释放它。

请参阅先前发布的苹果内存管理规则。

答案 3 :(得分:1)

有两种方法可以将信息存储在RAM中的C和c之类的东西,由编译器自动分配的原语,以及由你在程序中分配的内存块。

编译器为您分配的变量称为“自动变量”,可以使用基本未使用的(因为它是默认值)“auto”关键字进行标记。自动化被绑定到它们被声明的范围,并在它结束时消失。常规变量,如“int x”是自动的。

值得注意的是,指针通常是自动的。但是,他们指出的事情并非如此。那些就是你要求分配的东西。

在objective-c中,事物被分配了alloc消息。但是,有时课程会为您调用此类,因此您可能看不到它。为了帮助明确你应该做什么,有一个传统:如果你得到一个你分配它的对象,从方法名称中带有“copy”一词的类方法得到它,或者发送一个“保留” “消息,然后你拥有它的一部分,它就不会消失,直到你发送一条发布消息。

如果你没有通过其中一种手段获得对象,则不得释放它,因为你没有共享它。

因此,总结一下:常规变量(int,short,char,double,float,long)是自动的,不需要分配它。指针也是自动的,但是,他们指向的东西不是。在obj-c中,如果您分配了它,复制它或者发送了保留消息,那么您拥有一个共享。

答案 4 :(得分:0)

您无法释放整数......

Release仅适用于Objective-C类的实例。

整数等变量放在堆栈上,除非明确分配,否则它们在函数/方法调用后不会持久存在。

答案 5 :(得分:0)

您只发布对象。如果使用alloc,init过程来创建对象,则必须将其释放。如果保留对象,则必须将其释放。如果您使用的方法中包含“create”,则必须将其释放。除此之外,系统将为您处理。

答案 6 :(得分:0)

不需要释放基元,只需要释放对象。

要记住的最重要的事情是,无论何时“分配”或“保留”某个对象,都要进行相应的“释放”或“自动释放”。

答案 7 :(得分:0)

您在[temp release];行看到错误,因为temp不在范围内。在您创建的for循环之外不会看到temp

您不需要清理temp的内存,因为您尚未声明对其的所有权(请参阅内存管理规则):http://developer.apple.com/library/ios/#documentation/general/conceptual/DevPedia-CocoaCore/MemoryManagement.html

需要释放/管理内存的对象示例:

  • NSArray *myArray = [NSArray array];
  • NSNumber *myNumber = [NSNumber numberWithInt:5];
  • NSString *myString = @"Hello World";
  • NSInteger i = 5;
  • int x = 2;

执行需要释放/管理内存的对象示例:

  • NSArray *myArray = [[NSArray alloc] initWithObjects:@"Hello", @"World", nil];
  • NSNumber *myNumber = [[NSNumber alloc] initWithInt:5];
  • NSString *myString = [[NSString alloc] initWithString:@"Hello World"];
  •   -

通常,当你完全使用你拥有的对象时,你会清理它的内存

请参阅Apple的文档,了解propertieshttp://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17-SW1

的解释
  • 使用assignreadonly设置属性:您不应该担心释放内存,因为您不拥有它
  • 属性retaincopy:您声明对象的所有权并需要在某个时候发布

这个答案不会回答/解决所有内存管理问题/疑虑,但它可能会把你推向正确的方向