iPhone内存泄漏似乎超出了我的控制
Posted
技术标签:
【中文标题】iPhone内存泄漏似乎超出了我的控制【英文标题】:iPhone memory leak seems to be out of my control 【发布时间】:2009-06-06 16:47:03 【问题描述】:所以我正在制作一个非常基本的 Twitter 应用程序(它实际上是 iTunes 上斯坦福 iPhone 课程中的 Presence 2),当时我决定想看看我的应用程序是否泄漏。所以我跑了 Leaks,它马上就找到了一个。但是当我查看堆栈跟踪时,当我调用 UIApplicationMain 时,泄漏似乎发生在主函数中。
下图显示了仪器的堆栈跟踪和 xcode 中的相应代码。有谁知道我如何才能阻止这种泄漏以及为什么会发生这种情况?
alt text http://img193.imageshack.us/img193/1237/picture2fnj.png
编辑:好的,我已经搜索和搜索并找到了问题所在,但我仍然不知道发生了什么。我已经包含了我遇到问题的 TableViewController 的源代码。
当我将 cell.text 设置为 [names objectAtIndex:indexPath.row] 时,就会发生泄漏。有趣的是 NSIndexPath 似乎以某种方式泄漏。我应该如何使用 objectAtIndex 方法管理内存?
在不相关的主题上,编辑我的问题帖子是最好的回复方式吗?或者我应该在评论中发布我的代码?
@implementation PersonListTableViewController
- (id)initWithStyle:(UITableViewStyle)style
if (self = [super initWithStyle:style])
NSString *path = [[NSBundle mainBundle] pathForResource:@"TwitterUsers" ofType:@"plist"];
names = [[NSArray alloc] initWithContentsOfFile:path];
return self;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 0;
//return [names count];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
cell.text = [names objectAtIndex:indexPath.row];
return cell;
- (UITableViewCellAccessoryType)tableView:(UITableView *)table accessoryTypeForRowWithIndexPath:(NSIndexPath *)indexPath
return UITableViewCellAccessoryDisclosureIndicator;
- (void)dealloc
[names release];
[super dealloc];
@end
【问题讨论】:
一般不要在cmets中发布代码。它破坏了格式。编辑您的帖子是合适的。 泄漏的迹象并不是实际发生的地方;这是分配内存的地方。没有简单的方法来发现泄漏实际发生的时间(即最后一个指向对象的指针消失的时间点)。 【参考方案1】:您是在设备上还是在模拟器上运行工具?我发现两者之间的内存问题可能不同。
【讨论】:
我在模拟器上运行它。还没试过手机。 试试手机。可能会提供一些见解。 手机试了,没有漏电。多谢,伙计!!但这产生了一个新问题,即为什么模拟器会泄漏而手机本身却没有。很奇怪。 在模拟器版本的 Foundation 中可能存在设备版本中没有的系统泄漏,但这种情况非常罕见。 Cocoa(如在 AppKit 中)有几个小漏洞,但根据我的经验,Foundation 往往相当可靠。我还没有在 UIKit 中看到很多泄漏,尽管它们不会让我感到震惊。始终假设重复或大量泄漏是您的。当 Apple 泄漏时,它通常是到处都是一个对象。 我在模拟器中发生了几次泄漏,这对我来说没有任何意义,并且在设备上消失了。很高兴你的相似。【参考方案2】:您的应用程序代码中存在泄漏。 UIApplicationMain 函数是堆栈跟踪的入口点,如果您将调用跟踪到您的应用程序代码中,您会发现漏洞。
如果您能确定似乎泄漏的方法,您可以发布该代码,有人可能会提供更多帮助。
【讨论】:
【参考方案3】:从基础开始。确保在加载的第一个对象中释放所有 UI 控件和业务对象。确保 initalizition 期间的所有资源都已正确释放,然后确保您正确地安装事物。你使用的模式是这样的吗?:
UIButton *btn = [[UIButton alloc] init]; //not really complete...
myObj.myButton = btn;
[btn release]
最后,如果没有别的,请在您的脑海中逐步检查代码并确定某些内容何时出现alloc
,然后确定它被释放的确切时间。如果您无法确定release
的位置,您可能已经发现了内存泄漏。找到解决方案并重新测试。识别每个泄漏需要一段时间。我总是假设有多个来源,直到它们或它被解决。
就像 Andy 提到的那样,如果您需要更直接的帮助,您将需要发布更多代码。
【讨论】:
以上是关于iPhone内存泄漏似乎超出了我的控制的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏
iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView