Iphone 在类的dealoc方法中释放之前,我们可以检查对象是否为nil吗

Iphone 在类的dealoc方法中释放之前,我们可以检查对象是否为nil吗,iphone,ios,objective-c,ios6,Iphone,Ios,Objective C,Ios6,在dealloc方法中释放之前,我们可以检查对象是否为nil吗。我不熟悉目标C。这是避免细分问题的正确方法吗 -(void)dealloc{ if(stringObject!=nil){ [stringObject release]; } } 简单的 if(stringObject) 如果只想检查变量是否指向对象,则可以 但是对于Objective C,没有必要测试nil,因为发送给null对象的消息将不起任何作用。因此,可以说: -(void)dealloc {

在dealloc方法中释放之前,我们可以检查对象是否为nil吗。我不熟悉目标C。这是避免细分问题的正确方法吗

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

if(stringObject)
如果只想检查变量是否指向对象,则可以

但是对于Objective C,没有必要测试nil,因为发送给null对象的消息将不起任何作用。因此,可以说:

-(void)dealloc
{
    [stringObject release];
    stringObject = nil;
    [super dealloc]; //added because of the comments
}   
在ARC下,在大多数情况下,您可以省略整个dealloc,因为1发布是自动管理的,2对dealloc的调用是在对象结束其生命之前发出的,因此不需要nil。但是,如果使用自定义c样式分配,则可能仍然需要alloc方法。但这属于一个高级主题

这里有一个链接,指向一般使用对象的开发指南:

简单的

if(stringObject)
如果只想检查变量是否指向对象,则可以

但是对于Objective C,没有必要测试nil,因为发送给null对象的消息将不起任何作用。因此,可以说:

-(void)dealloc
{
    [stringObject release];
    stringObject = nil;
    [super dealloc]; //added because of the comments
}   
在ARC下,在大多数情况下,您可以省略整个dealloc,因为1发布是自动管理的,2对dealloc的调用是在对象结束其生命之前发出的,因此不需要nil。但是,如果使用自定义c样式分配,则可能仍然需要alloc方法。但这属于一个高级主题

这里有一个链接,指向一般使用对象的开发指南:


是的,你可以。在ARC之前,定义了一个非常常见的宏

定义安全释放对象如果对象!=nil{[object release];object=nil;}

注意:但是,向nil发送消息将返回nil。
是的,你可以。在ARC之前,定义了一个非常常见的宏

定义安全释放对象如果对象!=nil{[object release];object=nil;}

注意:但是,向nil发送消息将返回nil。
这就足够了,作为一个零测试,您的方法也是正确的,只是稍微长一点:

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 :)

这就足够了,作为一个零测试,您的方法也是正确的,只是稍微长一点:

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 :)
在Objective C中,在发布前测试nil是完全多余的,不会给代码增加任何弹性

事实上,分段错误EXC_BAD_ACCESS的整个点是有一个不是零的指针,因此指向某个内存,并在释放内存后访问该内存

如果指针是零,首先你将无法访问它的任何内存,并且在C中没有分割错误,不像C或C++。 分段故障的真正解决方案是正确的内存管理。如果保留/发布管理看起来太复杂,您可以看看ARC,它有自己的复杂性,尽管比手动保留/发布管理要小得多。

在发布前测试nil在目标C中是完全多余的,不会给代码增加任何弹性

事实上,分段错误EXC_BAD_ACCESS的整个点是有一个不是零的指针,因此指向某个内存,并在释放内存后访问该内存

如果指针是零,首先你将无法访问它的任何内存,并且在C中没有分割错误,不像C或C++。


分段故障的真正解决方案是正确的内存管理。如果保留/释放管理看起来太复杂,您可以看看ARC,它有其自身的复杂性,尽管比手动保留/释放管理小得多。

如果您使用ARC,则无需执行此操作,否则您可以直接释放任何对象,这不会产生任何问题请大家解释。现在我得到了澄清。如果你正在使用ARC,那么没有必要这样做,否则你可以直接释放任何对象,这不会产生任何问题。请大家为你的解释回答。现在我得到了澄清。啊,这有味道。你什么时候会需要这个?这是一个迹象,表明您根本没有正确平衡您的保留和释放。还是我遗漏了什么?@fzwo-我从来没有使用过这个宏,我非常了解retain/release/autorelease的工作原理;但是

is被用于许多我不得不使用的开源和开源项目中。即使是Three20也在使用它定义TT_RELEASE_safety__指针{[_指针释放];_指针=nil;},所以在这种情况下投票否决我的感觉很糟糕;仅仅因为你在某个地方看到它,并不意味着它是一种好的练习。特别是不是在three20.three20在iOS 3.0时代被许多人广泛使用。我在哪里说过使用这样的宏是一个好的实践?我说过Three20是一个很好的框架?我说这是非常普遍的。到别处去吧。@ludesign放松点,我不是在贬低你,我是在贬低你给出的答案。不管它是否被广泛使用,它都是有害的。如果你能向我解释为什么这是一个好的做法,我将很高兴地取消否决票。如果你不能,为什么要写在一个明显的初学者的答案里?啊,这很难闻。你什么时候会需要这个?这是一个迹象,表明您根本没有正确平衡您的保留和释放。还是我遗漏了什么?@fzwo-我从来没有使用过这个宏,我非常了解retain/release/autorelease的工作原理;但这在我不得不处理的许多开源和闭源项目中都使用过。即使是Three20也在使用它定义TT_RELEASE_safety__指针{[_指针释放];_指针=nil;},所以在这种情况下投票否决我的感觉很糟糕;仅仅因为你在某个地方看到它,并不意味着它是一种好的练习。特别是不是在three20.three20在iOS 3.0时代被许多人广泛使用。我在哪里说过使用这样的宏是一个好的实践?我说过Three20是一个很好的框架?我说这是非常普遍的。到别处去吧。@ludesign放松点,我不是在贬低你,我是在贬低你给出的答案。不管它是否被广泛使用,它都是有害的。如果你能向我解释为什么这是一个好的做法,我将很高兴地取消否决票。如果你做不到,为什么要在回答一个显然是初学者的问题时写下它?如果你在这里做的不仅仅是释放你持有的物品,那么你不能忽略dealloc。诚然,dealloc中的大部分时间都是这样,但正如你所说的,这是一个过于简单化的问题。@PaulR当我读到它时,问题是,安全释放Objective-C中可能为零的对象的正确方法是什么;这一点回答准确无误。@robvandervier如果不是dealloc,在对象生命周期中最晚可能的时间调用的方法是什么?除了您有时可能想要输入的明显日志记录之外there@RobvanderVeer@fzwo在ARC下实现dealloc确实有有效的用途。我用过的一些最明显的方法是释放C风格的malloc'd缓冲区,释放CoreFoundation类型,尽管这在现代ARC中不太需要,和关闭文件句柄和套接字。在ARC或MRR下,dealloc实现都是不正确的。如果您在其中做的不仅仅是释放您持有的对象,那么您不能忽略dealloc。诚然,dealloc中的大部分时间都是这样,但正如你所说的,这是一个过于简单化的问题。@PaulR当我读到它时,问题是,安全释放Objective-C中可能为零的对象的正确方法是什么;这一点回答准确无误。@robvandervier如果不是dealloc,在对象生命周期中最晚可能的时间调用的方法是什么?除了您有时可能想要输入的明显日志记录之外there@RobvanderVeer@fzwo在ARC下实现dealloc确实有有效的用途。我使用过的一些最明显的方法是释放C风格的malloc'd缓冲区,释放CoreFoundation类型(尽管现代ARC中不太需要),并关闭文件句柄和套接字。在ARC或MRR.true下,dealloc实现是不正确的,但与question@Rob范德维尔:你的问题是什么?对我来说是:如何避免分割错误。。。OP清楚地知道如何检查零。。。关键是:这对防止分段错误有用吗?答案是:不,对不起,我知道我们对所读的内容都有不同的理解。就我自己而言,我没有读到任何关于分割错误的内容。只有零测试。我想我们都可以想出一个例子,在这个例子中,对象nil测试非常方便。尽管如此,你的解释还是很好的,我们都在学习。@robvandervier:没关系,多重解释是网络的业力。另一方面,您是对的,除向对象发送消息外,测试nil在所有情况下都是必不可少的。true,但与question@Rob范德维尔:你的问题是什么?对我来说是:如何避免分割错误。。。OP清楚地知道如何检查零。。。关键是:这对防止分段错误有用吗?答案是:不,对不起,我知道我们对所读的内容都有不同的理解。就我自己而言,我没有读到任何关于分割错误的内容。J
这是零测试。我想我们都可以想出一个例子,在这个例子中,对象nil测试非常方便。尽管如此,你的解释还是很好的,我们都在学习。@robvandervier:没关系,多重解释是网络的业力。另一方面,您是对的,除向对象发送消息外,测试nil在所有情况下都是必不可少的。