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内存泄漏似乎超出了我的控制的主要内容,如果未能解决你的问题,请参考以下文章

iphone App中的内存泄漏

如何解决 xcode(仪器)中的 iPhone 应用程序内存泄漏

iPhone - 内存泄漏 - NSData dataWithContentsOfUrl & UIWebView

修复内存泄漏iphone的麻烦

iPhone ABPeoplePickerNavigationController 内存泄漏

iPhone - SBJsonParser 的另一个 Objective-C 内存泄漏