在开始在类的dealloc方法中释放之前,我们可以检查对象是否为nil

时间:2013-07-20 07:41:33

标签: iphone ios objective-c ios6

在dealloc方法中发布之前,我们可以检查对象是否为nil。我是客观的C新手。这是避免细分问题的正确方法吗?

-(void)dealloc{
  if(stringObject!=nil){
   [stringObject release];
   }
 }   

4 个答案:

答案 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方法。但这属于一个高级主题。

以下是有关使用对象的开发指南的链接:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithObjects/WorkingwithObjects.html#//apple_ref/doc/uid/TP40011210-CH4-SW1

答案 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; }

  • 注意:但是,向nil发送消息将返回nil。