Objective C方法变量初始化方法

时间:2011-06-28 13:07:31

标签: iphone objective-c initialization instance-variables

有没有人知道这个问题? 如果我需要一个实例变量,而不是一个属性,并在一个方法中初始化这个变量,那么当我需要它时,它已经被释放了。它适用于自动释放的对象。这是什么原因?

通常,实例变量应该具有类对象的整个生命周期。但似乎变量是函数的局部变量,并且它是一个自动释放对象,它会在函数退出时释放。

MyClass.h

@interface MyClass:UIViewController {
  NSDate * date;
}

MyClass.m

@implementation MyClass {

- (void) anInit {
  date = [NSDate date];
}

- (void) useDate {
  NSLog (@"%@", date); 
// here date is already release, and get bad access.
}

}

2 个答案:

答案 0 :(得分:4)

您需要retain约会。

下次排出自动释放池时,将释放自动释放的对象。发生这种情况时,与对象的生命周期无关。

您的实施应如下所示:

@implementation MyClass {

    - (void) anInit {
      date = [[NSDate date] retain];  // or [[NSDate alloc] init]
    }

    - (void) useDate {
      NSLog (@"%@", date); 
    }

    - (void) dealloc {
        [date release];
        [super dealloc];
    }

}

答案 1 :(得分:2)

[NSDate date]Convenience Constructor并且是自动发布的,您需要添加一个保留调用。还要确保只调用一次anInit,否则你将在不先调用[date release]的情况下创建内存泄漏。

- (void) anInit {
  date = [[NSDate date] retain];
}