【问题标题】:Objc Object Dealloc Memory ManagementObjc 对象 Dealloc 内存管理
【发布时间】:2011-07-26 08:02:20
【问题描述】:

如果我有一个名为 Catalog 的对象,它有一个名为“title”的(非原子,保留)属性。我做“[属性发布];”在 Catalog 的 dealloc 方法中:

-(void)dealloc {
    [title release], title = nil;
    [super dealloc];
}

稍后我会执行“Catalog *c = [Catalog new];”。

比较1:

dto.title = [[NSString alloc] initWithFormat:@"...", ...];

2:

dto.title = [NSString stringWithFormat:@"...",...];

在 dealloc 方法中释放对象的所有属性是常识,但是如果我传递一个访问器方法(已经具有自动释放)怎么办?那我应该在 dealloc 中释放还是不释放 accessor'd 属性?

【问题讨论】:

    标签: iphone objective-c memory


    【解决方案1】:

    title 的设置器保留了字符串,因此需要在 -dealloc 中释放它。你的第一个案例是错误的......你调用 +alloc 后跟 +stringWithFormat:。我怀疑你的意思是-initWithFormat:。此外,您需要在那里释放字符串,因为您正在分配它。对属性调用 -release 既丑陋又不可靠,因此通常使用临时变量来处理此类事情:

    NSString *string = [[NSString alloc] initWithFormat:...];
    dto.title = string;
    [string release];
    

    【讨论】:

    • +1 不错的答案,但可能会更好,因为使用 +stringWithFormat: 可以避免使用临时变量。
    • 我正在解决问题中的第一个案例。第二种情况使用+stringWithFormat,我同意那里不需要临时变量,因为不需要释放字符串。稍微编辑答案以减少歧义。
    【解决方案2】:

    如果访问器已经有一个自动释放,那么不要在 dealloc 中再次释放它。 new+copy+alloc 计数必须与 release+autorelease 计数匹配。

    【讨论】:

    • -dealloc 中的 -release 与属性中的 retain 匹配。
    • 自动释放的东西的生命周期使得自动释放的对象永远不能安全地成为实例变量的值。 IE。第一句话的含义是完全错误的;如果它是一个实例变量,它应该被保留或明确描述为弱。是否自动发布不在讨论范围内。
    • @bbum 如果他在分配后一段时间自动释放,那么他不应该在 dealloc 方法中再次释放它。我并不是说在这种情况下使用 autorelease 是一个好主意,我只是在回答被问到的问题。
    • 经过澄清,取消投票。看到太多人在将自动释放的对象分配给 ivars 时遇到了一些愚蠢的“但我会确保它仅在此通过偶数循环期间使用”的口头禅。
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 2023-04-07
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-08-21
    相关资源
    最近更新 更多