所以我正在制作一个非常基本的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
答案 0 :(得分:1)
您是在设备或模拟器上运行工具吗?我发现两者之间的记忆问题可能不同。
答案 1 :(得分:0)
您的应用程序代码中有些内容正在泄漏。 UIApplicationMain函数是堆栈跟踪的入口点,如果您按照调用到应用程序代码中,那么就会发现泄漏。
如果您可以识别似乎泄漏的方法,则可以发布该代码,并且有人可能会提供更多帮助。
答案 2 :(得分:0)
从基础开始。确保在所加载的第一个对象中释放所有UI控件和业务对象。确保在初始化过程中所有资源都得到适当释放,然后确保您正确地进行操作。您使用的模式是?:
UIButton *btn = [[UIButton alloc] init]; //not really complete...
myObj.myButton = btn;
[btn release]
最后,如果没有其他任何内容可以通过您的代码中的代码执行,并确定某些内容正在alloc
,然后确定它正在发布的确切位置。如果您无法确定release
的位置,则可能发现内存泄漏。找到解决方案并重新测试。识别每个泄漏需要一段时间。我总是假设有多个来源,直到它们或它被解决。
Andy提到,如果您需要更多直接帮助,则需要发布更多代码。