【问题标题】:How can I check if an object is released?如何检查对象是否被释放?
【发布时间】:2011-10-17 18:17:36
【问题描述】:

我需要能够检查我是否已经在 Objective-c 中释放了一个变量。我尝试检查它是否更改为null:

//Checks if buildview is null and returns respective output
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

//allocates memory and initalizes value
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

//Releases the view
[BuildView release];

//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
    NSLog(@"Build View Value (pointer): Null");
else
    NSLog(@"Build View Value (pointer): Not Null");

结果是:

Build View Value (pointer): Null
Build View Value (pointer): Not Null
Build View Value (pointer): Not Null

有没有更简单的方法来检查它是否被释放?

【问题讨论】:

标签: objective-c memory-management null


【解决方案1】:

通常,您不需要检查指针是否指向已释放的对象:您应该知道 :) 您的 变量 只保存一个内存地址。如果变量指向的内存内容被释放,变量(保存地址)的值将不会神奇地设置为 nil 或 NULL。 所以如果你发现有必要检查一个指针是否可能指向一个已经被释放/释放的地址空间,你应该重新考虑你的设计。

在开发期间,您可以执行诸如激活NSZombies 之类的操作,或使用 Instruments 来找出正在分配或释放对象的位置。

2015 年 6 月 26 日更新:当您在 OS X 10.7 及更高版本和 iOS 5 及更高版本上使用 weak 指针时,它们将在引用时自动设置为 nil对象被释放。见https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References

【讨论】:

    【解决方案2】:

    您的意思可能是解除分配(销毁),而不是释放。被释放并不意味着被释放,这是引用计数内存管理的点。被释放不是一种状态,你不能检查它;被摧毁是。

    如果您的意思是解除分配,那么不,没有。它被称为弱引用,Objective-C 没有它们用于引用计数。当一个对象被释放时,不会自动对指向它的指针做任何事情;它们变成了悬空指针。

    一种技术是让对象在释放期间发送通知,以便所有持有指针的东西都可以将其重置为 nil。

    一般来说,你必须设计你的程序,在你调用release之后不再使用对象指针。在您提供的示例代码中,除了分配新值之外,您不得再次将BuildView 用于其他任何事情。

    【讨论】:

    • 应该注意,出于历史目的,这个答案不再正确。 Objective-C 有弱引用,事实上,它总是如此,有足够的运行时黑客攻击。但是,对于正式版,它们需要 iOS 5 及更高版本。
    【解决方案3】:

    释放对象后,该对象的值不会设置为nil

    【讨论】:

    • 在被破坏的对象上调用 retainCount 会给你带来崩溃或其他未定义的行为,而不是零。
    • 事实上,该特定代码示例中最有可能的结果是retainCount 将返回 1即使它已被释放
    【解决方案4】:

    感谢“Cocoa with Love”,您可以试试这个

    http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html

    【讨论】:

      猜你喜欢
      • 2011-11-16
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多