作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现一个登录 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/
我是一名优秀的程序员,十分优秀!