我需要能够检查我是否已经在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
有没有更简单的方法来检查它是否已取消分配?
答案 0 :(得分:7)
通常,您不需要检查指针是否指向解除分配的对象:您应该知道:)您的变量只保存一个内存地址。如果取消分配变量所指向的内存的内容,则变量(保存地址)的值不会神奇地设置为nil或NULL。 因此,如果您发现有必要检查指针是否指向已经释放/取消分配的地址空间,那么您应该重新考虑您的设计。
在开发期间,您可以执行诸如激活NSZombies之类的操作或使用Instruments查找正在分配或取消分配对象的位置。
2015年6月26日更新:当您在OS X 10.7及更高版本以及iOS 5及更高版本上使用weak
指针时,它们将自动设置为{{1}当被引用的对象被释放时。见https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_References
答案 1 :(得分:5)
你可能意味着解除分配(被破坏),而不是被释放。 发布并不意味着解除分配,这就是计算内存管理的参考点。被释放不是一个国家,你无法检查它;被摧毁是。
如果你的意思是解除分配,那么不,没有。它被称为弱引用,而Objective-C没有它们用于引用计数。当一个对象被释放时,对它的指针不会自动执行任何操作;他们成了悬挂的指针。
一种技术是让对象在重新分配期间发送通知,以便保存指针的所有内容都可以将其重置为nil。
通常,您必须在调用release
之后再次使用对象指针的方式设计程序。在您提供的示例代码中,除了分配新值之外,您不得再使用BuildView
作为其他任何内容。
答案 2 :(得分:0)
释放对象后,该对象的值不会设置为nil
。
答案 3 :(得分:0)
感谢“Cocoa with Love”你可以试试这个
http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html