我在一个简单的应用程序中遇到内存泄漏问题。该代码取自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。你知道泄漏在哪里吗?
答案 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字节),相同的库和相同的帧。