我是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
答案 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。