0

假设我有一个实例变量 MyObject* 测试;

@property(nonatomic, retain) MyObject* test;

.m

@synthesize test;

我可能会初始化它,或者现在可能取决于我是否需要。如果我不需要它,就没有必要浪费初始化。

问题在dealloc中,进行下面的检查和释放是否安全?

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

谢谢!

4

4 回答 4

2

是的,它是安全的。但是,发送release到 nil 不会造成任何问题,因此您无需检查。

于 2011-09-30T10:42:13.870 回答
0

你不需要这样做。如果您将自动释放的对象分配给ivar ,您可以简单地执行此操作:

self.test = nil;

编辑:

不要忘记在dealloc函数[super dealloc]结束时调用

于 2011-09-30T10:42:10.767 回答
0

这是安全的,但不是标准做法。您可以安全地向 nil 引用发送消息,这是惯用 Objective-C 编写方式的重要组成部分。只需释放 ivar:

- (void)dealloc
{
    [test release];
    // ...
于 2011-09-30T11:03:43.797 回答
0

这很好。简单地省略nil.

在幕后,编译器(通常*)生成objc_msgSend对其变体或其变体之一的调用。(和变体)的实现objc_msgSend允许您消息的对象是nil,从某种意义上说,它定义良好并且不被认为是程序员的错误消息nilobjc_msgSend+ 变体的返回值归零:

例子:

NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0

这意味着如果返回 c++ 对象,您必须测试 nil ——如果接收者为 nil,则不会调用构造函数。

*通常,从某种意义上说,编译器调用了一些 c 函数来执行消息传递以及其他一些常见例程。

于 2011-09-30T11:24:24.077 回答