iOS:我应该在dealloc函数中释放对象吗?

时间:2012-05-25 02:46:55

标签: ios release

我对内存管理非常困惑。

在.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?

提前谢谢!

5 个答案:

答案 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中成为一个问题。