【问题标题】:about memory management on ios关于ios内存管理
【发布时间】:2012-01-20 03:02:52
【问题描述】:

这里我的viewController中有一个tableView,是这样的:

//.h
...
UITableView *aTable;
...
@property (nonatomic, retain) UITableView *aTable;
//.m
@synthesize aTable;
...
self.aTable = nil; // in viewDidUnload
[aTable release];  // in dealloc
...

现在,在 viewDidLoad 方法中我必须初始化这个表,所以我这样做了

// viewDidLoad
...
self.aTable = [[UITableView alloc] initWithFrame:xxxxx];
...

但是当我分析这个时,它提醒我在viewDidLoad中,

这个“aTable”可能存在内存泄漏,

但是我猜我是要在dealloc中释放了,那为什么还是有内存泄漏呢?

是关于“保留”属性的吗?

我是否必须在 alloc 和启动这个 tableView 的代码中添加自动释放?

非常感谢!

【问题讨论】:

    标签: objective-c ios memory memory-leaks


    【解决方案1】:

    是的,应该是(在非弧环境中):

    self.aTable = [[[UITableView alloc] initWithFrame:xxxxx] autorelease];
    

    这会给你一个自动释放的对象(保留计数:0)

    [[[UITableView alloc] initWithFrame:xxxxx] autorelease];
    

    这会保留表(保留计数:1)以便持久化到 viewDidUnload 或直到 Dealloc

    self.aTable = ...
    

    如果您不自动释放表,您将获得保留计数:2(alloc-init 之一,另一个来自保留属性),然后在 ViewDidUnload 上使用此行 self.aTable = nil; 您正在减少保留计数为 1,但随后将 nil 分配给您的 ivar,因此您丢失了对活动表的引用,因此泄漏了 tableView,然后在 dealloc 中,您将基本上使这个 [nil release] 无效。

    【讨论】:

    • 这是我的猜测,但如果是这样,“保留”属性的必要性是什么?我可以使用 assign 属性而不使用 autorelease,然后在 dealloc 中手动释放它们,对吗?
    • 是的,你可以这样做,我的规则是:如果你要将你的 ivar 暴露给世界,或者如果你要在 .m 中进行大量分配,请使用属性(为此我使用私有属性)。对于您的情况,我会放弃该属性(对我而言,如果您不打算利用其优势,则没有使用属性的意义)。
    • 另外你应该知道,如果你想坚持使用该属性,在 Arc 环境中你不能再使用 assign 用于 OBJ-C 类,你必须使用 weak 或者如果你想保留 IOS 4 支持unsafe_unretained
    • 哇,这似乎比我想象的要深远得多,无论如何我想我应该可以在分配时使用保留和自动释放,对吧?非常感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多