我们可以在 dealloc 方法中释放之前检查对象是否为 nil。我是目标 C 的新手。这是避免分割问题的正确方法吗?
-(void)dealloc{
if(stringObject!=nil){
[stringObject release];
}
}
我们可以在 dealloc 方法中释放之前检查对象是否为 nil。我是目标 C 的新手。这是避免分割问题的正确方法吗?
-(void)dealloc{
if(stringObject!=nil){
[stringObject release];
}
}
nil
在 Objective C 中对before进行测试release
是完全多余的,并且不会为您的代码增加任何弹性。
实际上,分段错误(EXC_BAD_ACCESS)的全部意义在于有一个不是 nil的指针,因此指向一些内存,并在它被释放后访问那块内存。
如果指针一开始就为零,您将无法使用它访问任何内存,并且在 Objective C 中不会出现分段错误(与 C 或 C++ 不同)。
分段错误的真正解决方案是正确的内存管理。如果保留/释放管理看起来太复杂,您可以看看 ARC,它有自己的复杂性(尽管比手动保留/释放管理要少得多)。
一个简单的
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 方法。但这属于高级话题。
以下是有关使用一般对象的开发指南的链接:
这足以作为 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 :)
是的你可以。在 ARC 之前定义了一个非常常见的宏
#define SAFE_RELEASE(object) if (object != nil) { [object release]; object = nil; }