IPhone内存管理:我需要在dealloc内部发布什么?

时间:2010-10-02 22:16:41

标签: iphone objective-c cocoa-touch

所以在我的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文件中查看我的评论,我只是想知道我的发布声明是否正确(如果没有,为什么)......

谢谢!

4 个答案:

答案 0 :(得分:2)

没有看到您的初始化代码,就无法分辨。作为一般规则,您需要释放未初始化的初始化内容。例如:

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

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

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

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

答案 1 :(得分:1)

NSNumber和NSString是objective-c类,您可以发布他们的实例。但是,您实际上是否需要取决于在为对象分配值时是否取得对象的所有权(即 - 是否保留值)。

因此,只有先前保留了一个对象(或者使用包含alloc,new或copy的方法 - 根据命名指南获取它),或者显式地或通过具有retain或copy属性的属性来释放对象。

一般来说,我认为,你必须保留你的ivars以确保它们的值在对象的生命周期内有效,所以释放几乎肯定会出现在我的类的dealloc方法中:)

答案 2 :(得分:0)

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

发布您拥有的内容。对于你不拥有的东西,请注意悬挂指针。

答案 3 :(得分:0)

在做其他任何事情之前,你真的需要阅读Cocoa的内存管理编程指南。

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