有没有人知道这个问题? 如果我需要一个实例变量,而不是一个属性,并在一个方法中初始化这个变量,那么当我需要它时,它已经被释放了。它适用于自动释放的对象。这是什么原因?
通常,实例变量应该具有类对象的整个生命周期。但似乎变量是函数的局部变量,并且它是一个自动释放对象,它会在函数退出时释放。
@interface MyClass:UIViewController {
NSDate * date;
}
@implementation MyClass {
- (void) anInit {
date = [NSDate date];
}
- (void) useDate {
NSLog (@"%@", date);
// here date is already release, and get bad access.
}
}
答案 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];
}