1

我们可以在 dealloc 方法中释放之前检查对象是否为 nil。我是目标 C 的新手。这是避免分割问题的正确方法吗?

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

4 回答 4

4

nil在 Objective C 中对before进行测试release是完全多余的,并且不会为您的代码增加任何弹性。

实际上,分段错误(EXC_BAD_ACCESS)的全部意义在于有一个不是 nil的指针,因此指向一些内存,并在它被释放后访问那块内存。

如果指针一开始就为零,您将无法使用它访问任何内存,并且在 Objective C 中不会出现分段错误(与 C 或 C++ 不同)。

分段错误的真正解决方案是正确的内存管理。如果保留/释放管理看起来太复杂,您可以看看 ARC,它有自己的复杂性(尽管比手动保留/释放管理要少得多)。

于 2013-07-20T07:52:09.843 回答
1

一个简单的

if(stringObject)

如果您只想检查变量是否指向对象,就可以了。

但是对于Objective C,没有必要进行测试,nil因为给空对象的消息将什么也不做。所以说一句就够了:

-(void)dealloc
{
    [stringObject release];
    stringObject = nil;
    [super dealloc]; //added because of the comments
}   

dealloc在 ARC 下,在大多数情况下,您可以省略整体,因为 1)release是自动管理的,以及 2) 对 dealloc 的调用是在对象结束其生命之前进行的,因此 nil 不是必需的。但是,如果您使用自定义 c 样式分配,您可能仍需要一个 alloc 方法。但这属于高级话题。

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

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

于 2013-07-20T07:43:39.430 回答
0

这足以作为 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 :)
于 2013-07-20T07:47:11.560 回答
-1

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

#define SAFE_RELEASE(object) if (object != nil) { [object release]; object = nil; }

  • 注意:但是,向 nil 发送消息将返回 nil。
于 2013-07-20T07:46:49.957 回答