简单的UITableView内存泄漏

时间:2012-03-18 13:00:29

标签: ios uitableview memory memory-leaks

我在一个简单的应用程序中遇到内存泄漏问题。该代码取自iPhone iOS Development Essentials一书。代码如下:

h文件

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
<UITableViewDelegate, UITableViewDataSource>

@property (strong, nonatomic) NSArray *colorNames;
@end

和m文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize colorNames;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.colorNames = [[NSArray alloc] initWithObjects:@"blue", @"red",@"green",@"yellow", nil];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    self.colorNames = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}
- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.colorNames count];
}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if(cell==nil)
    {
        cell = [[UITableViewCell alloc] 
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:CellIdentifier];
    }
    cell.textLabel.text = [self.colorNames objectAtIndex:[indexPath row]];
    return cell;
}

@end

每当我尝试使用iPhone模拟器滚动表格时,我的内存泄漏量为48k。你知道泄漏在哪里吗?

4 个答案:

答案 0 :(得分:2)

假设您不使用ARC

仅当 @property colorNames是您需要做的保留时才

NSArray* cArray = [[NSArray alloc] initWithObjects:@"blue", @"red",@"green",@"yellow", nil];
self.colorNames = cArray;
[cArray release];

此外,您的单元格已创建autorelease

if(cell==nil)
{
     cell = [[[UITableViewCell alloc] 
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier:CellIdentifier] autorelease];
}

编辑如果单击该内存泄漏,仪器可以将您带到导致泄漏的特定代码行。

希望它有所帮助。

答案 1 :(得分:1)

而不是@synthesize colorNames,您应该使用:

@synthesize colorNames = _colorNames;

这会创建一个名为_colorNames的ivar。

现在使用:

_colorNames = [[NSArray alloc] initWithObjects:@"blue", @"red",@"green",@"yellow", nil];

使用self.colorNames = [[NSArray ...的问题是您的属性colorNames会被双重保留。一次通过属性的属性(强)和一次通过调用'alloc'。

viewDidUnload中你应该使用:

[_colorNames release];
_colorNames = nil;

答案 2 :(得分:1)

我遇到同样的问题,已经发布了错误报告。 支持人员回答我他们已经知道问题,Bug仍然处于打开状态,ID是#10703036。

即使在Xcode的4.3.2更新后仍在等待......

答案 3 :(得分:0)

浏览不同的论坛我找到了答案(我希望)。由于泄漏来自lib system_c.dlib和负责任的框架strdup,人们声称它是Apple库中的一个包。 UIPickerView,UIDatePicker和UIScrollView控制器也遇到了同样的问题。相同的大小(48字节),相同的库和相同的帧。