调用堆栈在这里不会造成任何问题。只要 UpdateCheckWindowController 在调用后它被释放后不做任何事情,你会没事的。
有关如何更好地组织控制器生命周期的信息,请参阅 bbrame 的答案。我将只解释原始架构的内存管理后果。
所以,如果我的情况是正确的,你就会有以下类似的情况。someMethod
如果您在self
委托方法调用之后没有以任何方式引用,即使在返回之前可能会释放对象,它也会正常工作。
请注意,当委托方法返回时,UIKit 可能仍会引用您的视图控制器。也就是说,如果该视图控制器仍然是导航堆栈的一部分。在这种情况下,您不必担心它被过早释放,它只会在您的方法返回并且控件返回运行循环后才会发生。
@interface AppController: NSObject
@property (nonatomic, strong) UpdateCheckWindowController *ctrl;
- (void)updateCheckWindowController;
- (void)iAmDoneReleaseMe;
@end
@implementation AppController
- (void)updateCheckWindowController {
UpdateCheckWindowController *ctrl = [[UpdateCheckWindowController alloc] initWithDelegate:self];
// ...
// Retain the controller
self.ctrl = ctrl;
}
- (void)iAmDoneReleaseMe {
self.ctrl = nil;
}
@end
@interface UpdateCheckWindowController: NSObject
// Make it weak so we don't have a retain cycle
@property (nonatomic, weak) AppController *delegate;
@end
@implementation UpdateCheckWindowController
- (void)someMethod
{
// do all the finishing work here
// ...
// now call the delegate that will release us
[self.delegate iAmDoneReleaseMe];
// don't do anything else here and you'll be fine
}
@end