ivar检查它是否已被初始化和使用

时间:2011-09-30 10:35:45

标签: iphone init dealloc ivar

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

@property(nonatomic, retain) MyObject* test;

的.m

@synthesize test;

我可能会初始化它,或者现在可能依赖于我是否需要。如果我不需要它,那么在初始化时就没有浪费了。

问题在于dealloc,进行以下检查和发布是否安全?

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

谢谢!

4 个答案:

答案 0 :(得分:2)

是的,这是安全的。但是,将release发送到零不会造成任何麻烦,因此您无需检查。

答案 1 :(得分:0)

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

self.test = nil;

编辑:

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

答案 2 :(得分:0)

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

- (void)dealloc
{
    [test release];
    // ...

答案 3 :(得分:0)

这完全没问题。简单地省略nil的测试也是比较惯用的。

在幕后,编译器(通常为*)生成对objc_msgSend或其变体之一的调用。 objc_msgSend(和变体)的实现允许您发送消息的对象nil,因为它已被很好地定义,并且不被视为消息nil的程序员错误。 objc_msgSend +变体的返回值为零:

示例:

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

这意味着如果返回一个c ++对象,你必须测试nil - 如果接收者是nil,则不会调用构造函数。

*通常,在某种意义上,编译器调用它来执行消息传递以及其他一些常见例程。