在dealloc方法中发布之前,我们可以检查对象是否为nil。我是客观的C新手。这是避免细分问题的正确方法吗?
-(void)dealloc{
if(stringObject!=nil){
[stringObject release];
}
}
答案 0 :(得分:4)
在{C}之前对nil
进行测试在Objective C中是完全冗余的,并且不会为您的代码添加任何弹性。
实际上,整个分段错误点(EXC_BAD_ACCESS)的指针不是nil ,因此指向某个内存,并在释放后访问该内存。
如果指针首先是nil,则无法使用它访问任何内存,并且在Objective C中不会出现分段错误(与C或C ++不同)。
分段错误的真正解决方案是正确的内存管理。如果保留/发布管理看起来过于复杂,那么您可以看看ARC,它有其自身的复杂性(尽管比手动保留/发布管理要少得多)。
答案 1 :(得分:1)
一个简单的
if(stringObject)
如果你只是想检查变量是否指向一个对象,会这样做。
但是使用Objective C没有必要测试nil
,因为到null对象的消息将不执行任何操作。所以说:
-(void)dealloc
{
[stringObject release];
stringObject = nil;
[super dealloc]; //added because of the comments
}
在ARC下,你可以在大多数情况下忽略整个dealloc
,因为1)release
是自动管理的,2)对dealloc的调用是在对象结束之前做出的生活,所以没有必要。但是,如果使用自定义c样式分配,则可能仍需要alloc方法。但这属于一个高级主题。
以下是有关使用对象的开发指南的链接:
答案 2 :(得分:0)
这足以作为零测试(你的方式也正确,只是稍长):
if (stringObject)
{
//do something
}
但是在像你这样的简单案例中,你甚至不必这样做,因为在Objective-C中,向nil对象发送消息只意味着没有任何反应:
[aNilObject doSomething]; //nothing happens, this is perfectly valid and won't throw an exception; it won't even log anything. Once you're used to it, it's great and avoids lots of boilerplate nil checks.
更进一步,在您的情况下,您应该切换到ARC(在您完成学习手册保留和释放后,这是一个很好的练习)。
您的代码将如下所示:
//you don't need to call dealloc at all in ARC :)
答案 3 :(得分:-1)
是的,你可以。在ARC之前有一个非常常见的宏定义
#define SAFE_RELEASE(object) if (object != nil) { [object release]; object = nil; }