我对内存管理非常困惑。
在.h文件中声明变量allNoticeArray:
@interface NoticeViewController : UITableViewController
{
NSMutableArray *allNoticeArray;
}
@property (nonatomic, retain) NSMutableArray *allNoticeArray;
@end
在.m文件中使用Alloc并初始化变量:
@implementation NoticeViewController
@synthesize allNoticeArray;
- (void)viewDidLoad
{
[super viewDidLoad];
self.allNoticeArray = [[[NSMutableArray alloc] init] autorelease];
}
- (void)dealloc
{
[super dealloc];
/*
***should I release allNoticeArray here or not?***
*/
//[allNoticeArray release];
}
我是否应该在dealloc函数中释放allNoticeArray?
提前谢谢!
答案 0 :(得分:3)
看起来您手动管理内存而不是使用ARC。
如果你正在使用IOS5,convert your project to ARC可能更容易,那么在这种情况下你不必担心dealloc。
如果您不想使用ARC,则需要在此上下文中释放它,因为您在viewDidLoad中分配了它。您可能也对this article关于dealloc感兴趣。
答案 1 :(得分:3)
是的,您必须释放该对象。您可以在dealloc方法中执行以下操作,该方法将释放您的对象。
self.allNoticeArray = nil;
<强>原因:强> 虽然您已自动释放阵列,但您已将属性声明为保留。因此将保留和使用该对象。所以要从内存中完全删除对象,你应该再次调用它。 您可以在此处了解有关内存管理的所有信息https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
答案 2 :(得分:2)
ARC之前的内存管理规则是这样的:如果你分配,保留或复制一个对象,你必须稍后释放它,否则它会泄漏。您的属性设置为保留,因此保留的任何值都将保留。您必须将其与dealloc中的版本进行平衡。
答案 3 :(得分:2)
不使用ARC时,您应该使用dealloc中的版本。你说你保留.h文件会使保留计数增加1是对的。 Alloc / Init创建一个保留计数为1的对象。自动释放将抵消该保留,但是你的dealloc释放将计算.h。
中的保留设置self.allNoticeArray = nil;与发行版不同,但sElan的链接是一个很好的链接。
答案 4 :(得分:1)
简短的回答是否定的,但是您正在做一些不推荐的事情。在您的代码中,您将在单行中保留两次数组。在下面的代码中,它只保留一次。
你应该像这样初始化数组 -
NSMutableArray *array = [[NSMutableArray alloc] init] autorelease];
self.allNoticeArray = array;
我建议您考虑使用ARC,它会使内存管理在IOS 5中成为一个问题。