示例:我有一个视图控制器并摆脱它。但是仍然有一个变量保存它的内存地址。访问它会导致EXEC_BAD_ACCESS。当然。但是:有没有办法检查该变量是否仍然有效?即如果它仍然指向内存中存在的东西?
答案 0 :(得分:18)
您需要再次阅读:
Cocoa Memory Management Guidelines
简而言之,如果你想要一些东西,必须 retain
。
如果您希望某些内容消失并且之前已保留,则必须release
或autorelease
。
您必须永远不会直接致电dealloc
([super dealloc];
方法结尾处的dealloc
除外。
您绝不能 release
或autorelease
您没有retain
的对象。
请注意,某些方法执行会返回您必须release
的保留对象。如果您alloc
是一个类的实例,则表示retain
。如果您copy
和实例,则保留副本。
如果您想要使用retainCount
方法,请不要这样做。它没用。仅将保留计数视为增量;如果添加,则必须减去,但绝对值是应忽略的实现细节。
(换句话说,即使有办法明确检查对象的有效性 - 没有 - 这将是错误的答案。)
哦,并使用Xcode中的构建和分析功能。它确实很好 - 但不是很完美 - 识别内存管理问题等等。
答案 1 :(得分:2)
这就是整个内存管理模型的设置 - 如果您在正确的时间拨打retain
,并在正确的时间拨打release
和autorelease
,这是不可能的。您可以使用NSZombie
来帮助您进行调试。
答案 2 :(得分:1)
使用“NSZombieEnabled”断点。
因此,只有强烈建议我们使用访问者。如果您的对象在任何地方被释放,它将被分配为nil,如果您在Nil对象上调用任何API或方法,则不会有任何损害。所以请养成使用Accessors的习惯。
您只需在构建设置中将此NSZombieEnabled标志作为参数添加到您的应用程序中。并启用它。现在,您以调试模式运行应用程序。如果即将发生任何此类崩溃,此断点将显示释放哪个对象以及崩溃的位置。
干杯, Manjunath
答案 3 :(得分:0)
如果是变量,则表示指向对象的指针是否仍然引用有效内存:
MyClass * myVariable = [[MyClass alloc] init];
//发生了很多事......
if(myVariable!= nil) //做更多的事情