gpt4 book ai didi

objective-c - ObjC : How to proper implement a class that release itself?

转载 作者:行者123 更新时间:2023-11-28 20:47:23 25 4
gpt4 key购买 nike

我正在实现一个登录 View ,我需要这个 View 随时显示在我的应用程序中。所以为了更容易,我创建了一个名为 showLogin 的类方法,当 View 关闭时我希望它自行释放,所以我这样做了:

@implementation LoginController

@synthesize releaseOnClose;

+ (void)showLogin {
LoginController *login = [[LoginController alloc] init];
login.releaseOnClose = YES;
[login show]; // Potential leak of login object
}

- (id)init {
if (self = [super initWithNibName:@"Login" bundle:[NSBundle mainBundle]]) {
releaseOnClose = NO;
}
return self;
}



- (void)show {
if (self.view.superview == nil) {
// show the view
}
}



- (void)btnCloseTouched {
[self.view removeFromSuperview];
if (releaseOnClose) {
[self release];
}
}

静态分析器告诉我 showLogin 有潜在的泄漏,但实际上并没有,因为我在 btnCloseTouched 中释放了对象(不用担心登录 View 的其他功能,现在它只是打开并关闭)。

所以我想知道如何避免这种潜在的泄漏消息,以及如何正确实现这种类方法以正确处理内存?

想法

更多关于我的想法。我想调用 showLogin,它会一直存在,直到它关闭,而调用者不必管理实例。

最佳答案

它提示泄漏的原因是因为您正在分配未释放的内存 - 例如:

LoginController *login = [[LoginController alloc] init];

而且您执行此操作的方式似乎完全倒退 - 不太确定为什么要在其自身内部实例化 LoginController 的新对象,然后释放 self 以尝试释放新对象?必须有更好的方法。

您必须释放您分配的实例 - self 不是您分配的新实例(登录)。

完成后执行以下操作:

[login release];

关于objective-c - ObjC : How to proper implement a class that release itself?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4604669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com