我有一个包含一个UIView和两个UILabel子视图的.xib文件,该文件链接到一个名为Note的类,并为每个标签相应地分配了outlets,该类的定义如下所示。
@interface Note : UIView {
IBOutlet UILabel *time;
IBOutlet UILabel *content;
}
我用下面的代码构造它
NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"Note" owner:self options:nil];
note = [nibViews lastObject];
[self addSubview:note];
现在,在我的Note类dealloc阶段,我既没有发布时间,也没有发布内容,但我想知道我是否应该发布?
- (void)dealloc {
[super dealloc];
}
我假设我没有这样做,因为我没有在代码中显式地保留这些对象,也没有将它们合成到getter/getter中。但是我对nib解压还不够了解,不知道我是否应该在我的dealloc阶段发布这些东西?
发布于 2008-12-20 00:39:30
这在iPhone上是正确的,但在Mac上就不正确了。
但是,您可能希望重新编写此代码。假设视图将是从nib加载的最后一个对象是不安全的。相反,我建议您要么将其连接到视图控制器中的" Note“出口,要么扫描列表中作为Note的子类的对象。(如果您要加载多个Notes并使用outlet选项,只需确保在加载另一个Notes之前添加了一个Notes。)
发布于 2008-12-22 03:23:48
你确实需要释放它。看见
但是,在重建对象层次结构时,UIKit会使用setValue:forKey:方法重新建立对象之间的连接,该方法使用可用的设置器方法,如果没有可用的设置器方法,则默认情况下会保留对象。在Nib Object Retention中
换句话说,因为您没有将这些条目指定为@property (它隐式地声明了setter),或者没有直接提供setter,所以没有可用的setter方法,这一段的最后一部分适用-默认情况下对象是保留的。
您应该在dealloc()方法中,使用以下命令将所有IBOutlets设置为nil
self.outletName = nil;
如果未定义NSAutoreleasePool,则setValue将自动释放旧值(如果在线程中运行,请确保您有setter )。如果定义了setter,它将执行您定义的任何行为。无论哪种方式,设置为nil都会做正确的事情,并确保不会发生内存泄漏。不要这样做
outletName = nil;
这将直接设置成员变量,并绕过调用setValue。
有关更多详细信息,请参阅NSObject setValue:forKey的文档。
运行性能工具(Leaks)不会显示泄漏,但您可以通过查看当前运行的已分配内存总量来验证是否确实存在泄漏。
发布于 2012-05-09 06:42:17
您将无法将它们从内存中取出,除非您将IBOutlets声明为属性并将其合成为ivar:
@interface Note : UIView {
IBOutlet UILabel *time;
IBOutlet UILabel *content;
}
@property (nonatomic, retain) IBOutlet UILabel *time;
@property (nonatomic, retain) IBOutlet UILabel *content;
@end
@implementation Note
@synthesize time, content;
// your methods
- (void)dealloc {
[time release], time = nil;
[content release], content = nil;
[super dealloc];
}
@end
https://stackoverflow.com/questions/382576
复制相似问题