Справка по ошибке EXC_BAD_ACCESS - PullRequest
1 голос
/ 23 июня 2011

Я новичок в 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 Ответ

3 голосов
/ 23 июня 2011

Управление памятью может сначала сбить с толку.Выпускать только те объекты, которые вы создали.Это почти только в том случае, если вы используете слова alloc, init, retain.

Проблема в вашем случае в том, что вы на самом деле не являетесь владельцем объекта, он автоматически освобождается, потому что вы не выделяли, не инициировали и не сохраняли его,Это нормально, но выпускать его не ваша задача, так что не беспокойтесь об этом.

Если позже вы получите ошибки «EXC_BAD_ACCESS», может быть полезно использовать NSZombies чтобы помочь найти, где вы выпускаете неправильно.Они работают, помещая «зомби» в память, куда бы вы ни отпустили объект, чтобы легче было понять, в чем проблема.

РЕДАКТИРОВАТЬ: Например, скажем, у вас есть:

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

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

Вы должны были бы освободить foo, вызвав: [foo release]; в какой-то момент, но вам не пришлось бы освобождать bar, потому что вы не использовали alloc для выделения памяти для него.Это касается любого типа объекта, а не только NSString.Отличный сайт, объясняющий это, можно найти здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...