2

我对内存管理很困惑。

在 .h 文件中声明变量 allNoticeArray:

@interface NoticeViewController : UITableViewController
{   
    NSMutableArray *allNoticeArray;    
}
@property (nonatomic, retain) NSMutableArray *allNoticeArray;
@end

分配并初始化 .m 文件中的变量:

@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 吗?

先感谢您!

4

5 回答 5

3

看起来您是在手动管理内存而不是使用 ARC。

如果您使用的是 IOS5,将项目转换为 ARC可能会更容易,那么在这种情况下您不必担心 dealloc。

如果你不想使用 ARC,你需要在这个上下文中释放它,因为你在 viewDidLoad 中分配了它。您可能还对这篇关于 dealloc 的文章感兴趣。

于 2012-05-25T02:54:31.507 回答
3

是的,您必须释放该对象。您可以在您的 dealloc 方法中执行以下操作,这将释放您的对象。

self.allNoticeArray = nil;

原因: 虽然您已自动释放数组,但您已将您的属性声明为保留。所以对象将被保留和使用。因此,要从内存中完全删除对象,您应该再次调用 release 。您可以在此处了解有关内存管理的所有信息https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

于 2012-05-25T03:30:38.900 回答
2

pre-ARC 内存管理的规则是:如果你分配、保留或复制一个对象,你必须稍后释放它,否则它会泄漏。您的属性设置为保留,因此它将保留其持有的任何值。您必须平衡它与 dealloc 中的释放。

于 2012-05-25T03:16:09.533 回答
2

当不使用 ARC 时,您应该在 dealloc 中使用 release。您说得对,您在 .h 文件中的保留将保留计数增加一。Alloc/Init 创建一个保留计数为 1 的对象。自动释放将抵消该保留,但是您的 dealloc 释放将计算 .h 中的保留。

设置 self.allNoticeArray=nil; 与发布不同,但来自 sElan 的链接是一个很好的链接。

于 2012-05-25T03:36:04.033 回答
1

简短的回答是否定的,但您正在做一些不推荐的事情。在您的代码中,您在一行中保留了两次数组。在下面的代码中,它只保留一次。

你应该像这样初始化数组 -

NSMutableArray *array = [[NSMutableArray alloc] init] autorelease];
self.allNoticeArray = array;

我建议您考虑使用 ARC,它使内存管理在 IOS 5 中成为非问题。

于 2012-05-25T02:57:06.370 回答