【问题标题】:Dangling pointers in objective c - does nil also release memory?目标c中的悬空指针-nil是否也释放内存?
【发布时间】:2014-01-01 21:04:41
【问题描述】:

我的理解是:

内存未释放或“释放”时会发生内存泄漏 当指针未设置为 nil 并且对象被释放时,就会出现悬空指针。

我的问题是:可以将对象设置为 nil 释放内存并清除指针引用吗?

Car *myCar = [[Car alloc] initWithCoolRims: YES];
myCar = nil;
//no mem leaks or dang pointers

或者 ARC 是否这样做:

Car *myCar = [[Car alloc] initWithCoolRims: YES];
[myCar release];    
myCar = nil;
//no mem leaks or dang pointers

谢谢

【问题讨论】:

  • afaik, myCar = nil; 不会导致内存被释放(引用计数不变),所以在第一种情况下你有一个内存泄漏。在第二种情况下,没有内存泄漏,并且通过 nil-lifying myCar 您避免了 dang ptrs(前提是您在使用它之前检查它 ptr 是 nil ......)
  • 您的问题是“ARC 是否执行此操作”或“我必须手动执行此操作”吗?两个“无内存泄漏”的 cmets 相互矛盾。
  • @ShinTakezou 在 ARC 下,将 __strong 指针设置为 nil 会导致指向的对象为 - released。
  • @H2CO3 有趣;我不记得Car *myCar 是强ptr 还是弱ptr,没有明确说明;我想答案是默认是强然后
  • @ShinTakezou:除非另有标记,否则对象指针是强引用。如果不是这样,ARC 有权在您有机会使用它之前解除分配该对象。

标签: objective-c pointers automatic-ref-counting


【解决方案1】:

ARC

对于您的第一个示例,myCar 将设置为 nil,并且新创建的 Car 将在某个时候被释放。这是因为myCar 是唯一引用您新创建的Car 的东西。

如果其他东西有指向新创建的Car 的强指针,那么这将简单地将nil 排除在myCar 的引用之外,其他感兴趣的引用将决定Car 实例的生命周期

非ARC

人们还在这样做吗?

您的第一个示例确实是内存泄漏 - 您丢失了指向新 Car 实例的唯一指针,而没有减少来自 alloc 的 +1 引用。

【讨论】:

  • 需要注意的是,这仅在 ARC 下是正确的。
  • @bbum 似乎总是理所当然地认为人们已经离开了非 ARC。更新了我的答案以加强您的评论。
  • Paul 您的编辑澄清了一切。非常感谢!
【解决方案2】:

您执行第一个,ARC 执行第二个等效项。没有悬空引用,不管有没有 nil 赋值,因为 ARC 保留了被引用的对象(保留计数 1),当执行超出 myCar 定义的范围时,ARC 将保证释放 myCar 的引用对象,减少引用计数如果结果引用计数为 0,则释放对象内存。

【讨论】:

    猜你喜欢
    • 2017-05-07
    • 2012-12-28
    • 2011-07-23
    • 2011-11-15
    • 2017-03-01
    • 2016-03-06
    • 1970-01-01
    • 2019-06-18
    • 2020-07-24
    相关资源
    最近更新 更多