iPhone内存泄漏似乎超出了我的控制范围

iPhone内存泄漏似乎超出了我的控制范围,iphone,objective-c,memory-leaks,Iphone,Objective C,Memory Leaks,所以我正在制作一个非常基本的Twitter应用程序(实际上是iTunes上斯坦福iPhone课程的Presence 2),当时我决定看看我的应用程序是否泄漏。所以我查了一下漏洞,它马上就发现了一个。但是,当我查看堆栈跟踪时,当我调用UIApplicationMain时,泄漏似乎发生在主函数中 下图显示了仪器的堆栈跟踪和xcode中的相应代码。有人知道我怎样才能阻止泄漏,为什么会发生吗 编辑:好的,我搜索了又搜索,找到了问题所在,但我仍然不知道发生了什么。我已经包含了我遇到问题的TableVie

所以我正在制作一个非常基本的Twitter应用程序(实际上是iTunes上斯坦福iPhone课程的Presence 2),当时我决定看看我的应用程序是否泄漏。所以我查了一下漏洞,它马上就发现了一个。但是,当我查看堆栈跟踪时,当我调用UIApplicationMain时,泄漏似乎发生在主函数中

下图显示了仪器的堆栈跟踪和xcode中的相应代码。有人知道我怎样才能阻止泄漏,为什么会发生吗

编辑:好的,我搜索了又搜索,找到了问题所在,但我仍然不知道发生了什么。我已经包含了我遇到问题的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

您的应用程序代码中存在泄漏。UIApplicationMain函数是堆栈跟踪的入口点,如果您跟踪应用程序代码中的调用,您将在那里发现漏洞


如果您能够识别出似乎正在泄漏的方法,您可以发布该代码,有人可能会提供更多帮助。

从基本知识开始。确保在加载的第一个对象中释放所有UI控件和业务对象。确保初始化过程中的所有资源都已正确释放,然后确保正确安装。你用的是这样的模式吗

UIButton *btn = [[UIButton alloc] init]; //not really complete...
myObj.myButton = btn;
[btn release]
最后,如果没有其他东西,请在脑海中浏览代码,确定什么时候某个东西被释放,然后确定它被释放的确切点。如果您无法确定
版本的位置,则可能已发现内存泄漏。找到解决方案并重新测试。识别每个泄漏都需要一段时间。我总是假设有多个来源,直到它们或它被解决


就像Andy提到的,如果你需要更直接的帮助,你需要发布更多的代码。

你是在设备上运行工具还是在模拟器上运行工具?我发现两者之间的内存问题可能有所不同。

我正在模拟器上运行它。还没试过电话。试一下电话。可能提供一些见解。试过电话,没有泄漏。谢谢你,伙计!!但这就产生了一个新的问题,为什么模拟器会泄漏,而手机本身却不会。奇怪的是,在模拟器的基础版本中可能有系统泄漏,而不是在设备的版本中,但这是非常罕见的。可可(在AppKIT中)有几处小漏洞,但在我的经验中,基金会趋于稳固。我还没有看到UIKit中有很多漏洞,尽管它们不会让我震惊。始终假定重复或大量泄漏属于您。当苹果公司泄密时,它通常只是一个东西。我在模拟器中有几处泄密,对我来说没有任何意义,并且在设备上消失了。很高兴你的类似。一般不要在评论中发布代码。它会破坏格式。编辑你的帖子是恰当的。泄漏的迹象并不是它实际发生的地方;这是分配内存的地方。没有简单的方法可以发现泄漏实际发生的时间(即指向对象的最后一个指针消失的时间点)。