2011-01-12 73 views
2

在我的iPad应用程序在iOS 4.2.1 UIScrollViewDelegate类中,-scrollViewDidEndDecelerating:方法调用另一个,做的方法,这一点:为什么` - [UILabel setText:]`泄漏?

EntryModel *entry = [entries objectAtIndex:index]; 
self.titleLabel.text = entry.title; 

title是一个非原子,保留EntryModel的NSString的财产。 titleLabel是一个非原子的保留属性,IBOutlet将它连接到在笔尖中定义的UILabel。在bbum的blog post之后,我一直在使用Heapshot分析,并将上述代码标识为泄漏。几乎每一个我滚动到一个新的页面时,titleLabel泄漏了一下:

alt text

如果我更改第二行:

self.titleLabel.text = @"Whatever"; 

泄漏停止:

alt text

我很困惑。在分配新值之前,-[UILabel text]是否不释放旧值?我假设没有,我必须做错什么。为什么会泄漏?

回答

0

鉴于您拥有零分配的heapshot世代,它不是一致的内存增加。它可能是缓存[出错],或者它可能是与滚动有关的泄漏,通过事件中的裂缝而落下。

分配中的heapshot迭代显示了什么?

1

也许你实际上并没有泄漏记忆。你的分配内存,因为UILabel的文本属性使用复制语义。因此,调用self.titleLabel.text将在作业的右侧创建一个NSString的副本。试着用Leaks工具运行,看看你是否在泄漏内存。

+0

泄漏并不认为这是泄漏,但很明显。我明白`titleLable.text`会创建一个NSString的副本,但是为什么当一个新值被分配给它(并被复制)时它不会释放它? – theory 2011-01-12 20:08:52

+0

如果Leaks没有将其视为泄漏,您为什么认为这是泄漏?如果`titleLable.text`没有正确释放字符串,Leaks会将其称为泄漏。 – pwc 2011-01-12 20:54:46