Записать данные акселерометра в файл на Iphone IOS - PullRequest
2 голосов
/ 15 июля 2011

Привет, я пытаюсь записать в файл данные акселерометра.Вот мой код:

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {

//xax.text = [NSString stringWithFormat:@"X:[%2.6f]",acceleration.x];   
//yax.text = [NSString stringWithFormat:@"Y:[%2.6f]",acceleration.y];   
//zax.text = [NSString stringWithFormat:@"Z:[%2.6f]",acceleration.z];

NSString *acc_x = [[NSString alloc] initWithFormat:@"X:[%2.6f]",acceleration.x];
NSString *acc_y = [[NSString alloc] initWithFormat:@"Y:[%2.6f]",acceleration.y];
NSString *acc_z = [[NSString alloc] initWithFormat:@"Z:[%2.6f]",acceleration.z];

xax.text = acc_x;
yax.text = acc_y;
zax.text = acc_z;

[acc_x release];
[acc_y release];
[acc_z release];


//wfm == 2 //Initialization of Appending to the file
if (wfm == 2)
{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *txtFileName = [[NSString alloc] initWithFormat:@"tmp/%@.txt",txtName.text];
    NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:txtFileName];

    //NSString *fileName = [NSHomeDirectory() stringByAppendingPathComponent:@"tmp/acc_w_trial2.txt"];

    //Current Contents of the file
    NSString *fileCurrent = [[NSString alloc] initWithContentsOfFile:fileName];

    //Date and Time of each Accelerometer Data
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm:ss:SSS"];
    NSDate *date = [NSDate date];
    NSString *formattedDateString = [dateFormatter stringFromDate:date];

    NSString *msg = [[NSString alloc] initWithFormat:@"%@%@ %@%@%@ \n",fileCurrent,formattedDateString,xax.text,yax.text,zax.text];

    //Convert NSstring to NSData
    NSData* data=[msg dataUsingEncoding: [NSString defaultCStringEncoding]];

    //bool fileCreationSuccess = [fileManager createFileAtPath:fileName contents:data attributes:nil];
    [fileManager createFileAtPath:fileName contents:data attributes:nil];

    [msg release];
    [dateFormatter release];
    [fileCurrent release];
    [txtFileName release];

}   

}

Я получаю предупреждение уровня 1 и уровня 2. Есть ли способ освободить память NSFileManager, чтобы предотвратить ее блокировку?

Ответы [ 2 ]

1 голос
/ 16 июля 2011

Ваш метод обработчика для сбора данных акселерометра кажется не очень эффективным. Вы выделяете ресурсы (память, файл) каждый раз, что может занять много времени. Вы должны выделить необходимые ресурсы только один раз (то есть использовать dispatch_once) и оставить файл открытым. Используйте NSFileHandle (метод fileHandleForWritingAtPath) для добавления данных в конец файла.

Кроме того, NSHomeDirectory () - это не то место, где вы должны сохранять пользовательские данные, поскольку приложения для iOS находятся в «песочнице».

Либо используйте NSTeilitaryDirectory (), либо пишите в папке «Документы» или «Библиотека». Ниже приведен пример кода Apple, обычно в классе делегатов приложения:

- (NSString *)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}
0 голосов
/ 15 июля 2011

Вы можете попробовать использовать пул авто-релиза.

...