繁体   English   中英

iPhone内存管理:我需要在dealloc中释放什么?

[英]IPhone Memory Management: What do I need to release inside dealloc?

所以说在我的viewcontroller的.h文件中,我有:

@interface MyViewController : UIViewController {

IBOutlet UILabel *myLabel;
IBOutlet UIView *myView;
IBOutlet UIImageView *myImageView;
IBOutlet UIButton *myButton;

NSNumber *myNumber; 
NSString *myString;
NSMutableArray *myArray;

UILabel *myCurrentLabel;
SomeObject *myObject;

CGPoint myPoint;    
}

...现在在viewcontroller的.c文件中

- (void)dealloc {

[myLabel release];
[myView release];
[myImageView release];
[myButton release];

[myNumber release]; // is this necessary?
[myString release]; // is this necessary?
[myArray release];

[myCurrentLabel release];
[myObject release];

// I don't need to release myPoint because it's a struct

[super dealloc];
}

请在.c文件中查看我的评论,我只是想知道我的发布声明是否正确(如果不正确,为什么)...

谢谢!!

如果没有看到您的初始化代码,就无法分辨。 通常,您需要释放任何未自动释放的初始化内容。 例如:

//AUTORELEASED
NSArray *array1 = [NSArray arrayWithObject:@"foo"];                       

// NOT AUTORELEASED
NSArray *array2 = [[NSArray alloc] initWithObject:@"foo"];                

// AUTORELEASED
NSArray *array3 = [[[NSArray alloc] initWithObject:@"foo"] autorelease];

在上面的3中,如果以后不使用任何其他代码替换它们,则只需释放array2。

NSNumber和NSString是Objective-c类,您可以释放它们的实例。 但是,实际上是否要这样做取决于是否在为对象分配值时是否拥有对象的所有权(即,是否保留值)。

因此,仅当显式地或通过具有keep或copy属性的属性保留对象(或使用包含alloc,new或copy的方法(根据命名准则)获取对象)时,才释放对象。

总的来说,我认为您必须保留ivars,以确保其值在对象的生存期内有效,因此release几乎肯定会出现在我的类的dealloc方法中:)

如果您使用的是属性,请使用属性语法并将其在dealloc中设置为nil 设置器将根据属性是否声明为保留/复制和分配来执行“正确的事情”。

释放您拥有的东西。 小心悬挂不属于您的东西的指针。

在执行其他任何操作之前,您确实需要阅读《内存管理编程指南》。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM