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