EXC_BAD_ACCESS错误帮助

时间:2011-06-23 00:01:05

标签: objective-c memory-management

我是objective-c的新手,我无法弄清楚内存处理在这种语言中是如何工作的。这是我从turorial写的一些代码,我很困惑为什么当我取消注释[filePath release]我得到一个错误,即使该方法已经完成。我读了一些关于内存处理如何工作的文章,但我不知道我在这里做错了什么。

#import "saaving_dddaaattaViewController.h"

@implementation saaving_dddaaattaViewController
@synthesize field;

-(NSString *)pathOfFile {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsFolder = [paths objectAtIndex:0];// paths[0] = documents directory
return [documentsFolder stringByAppendingFormat:@"myfile.plist"];
}

-(void)applicationWillTerminate:(NSNotification *)notification {
NSLog(@"Saving data...");
NSMutableArray *array = [[NSMutableArray alloc]init];
[array addObject:field.text];
[array writeToFile:[self pathOfFile] atomically:YES];
[array release];
}

- (void)dealloc {
[field release];
[super dealloc];
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
NSString *filePath = [self pathOfFile];
if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {
    NSLog(@"File[%@] does exist.", filePath);
    NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
    field.text = [array objectAtIndex:0];
    [array release];
}

UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:app];

//[filePath release];// <--- commented out release
[super viewDidLoad];
}

- (void)viewDidUnload {
[super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

1 个答案:

答案 0 :(得分:3)

内存管理起初可能会令人困惑。仅释放您已创建的对象。这几乎只有在你使用单词alloc,init,retain。

时才会这样

你的情况下的问题是你实际上没有拥有该对象,它是自动释放的,因为你没有分配,初始化或保留它。这很好,但发布它不是你的工作,所以不要担心。

如果稍后出现“EXC_BAD_ACCESS”错误,使用NSZombies帮助查找错误发布的位置可能会有所帮助。他们的工作方式是将“僵尸”放在内存中,无论你在哪里发布一个对象,这样就更容易分辨出问题所在。

编辑:例如,说你有:

NSString *foo = [[NSString alloc] initWithString:@"foo"];

NSString *bar = [NSString stringWithString:@"bar"];

你必须通过在某个时候调用[foo release];来释放foo,但是你不必释放吧,因为你没有使用alloc来为它分配内存。这适用于任何类型的对象,而不仅仅是NSString。可以找到一个很好的网站解释这个here

相关问题