2009-12-27 2 views
0

Я слишком долго пытался выяснить, что происходит не так, поэтому я надеюсь, что кто-то ее сможет мне помочь.Нужна помощь с iphone sdk: не правильно сохранить каталог .plist в документах

Мой код:

- (IBAction)fedDog { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"dogsFedDays.plist"]; 
    NSMutableArray *dogsFedSave = [[NSMutableArray alloc] arrayWithCapacity: 48]; 
    for (int i = 0; i < 48; i++) { 
     NSDictionary *myDict = [[NSDictionary alloc] initWithObjectsAndKeys: 
           date[i], @"string", 
           fed[i], @"Yes", 
           nil]; 
     [dogsFedSave addObject:myDict]; 
     [myDict release]; 
    } 
    if (![dogsFedSave writeToFile:path atomically:YES]) 
     NSLog(@"not successful in completing this task"); 
} 

Я подключил действие к кнопке, но при нажатии на кнопку, Тренажер замерзает, и файл не появляется в папке Documents.

+0

Дон» t спросить о двух несвязанных проблемах в одном вопросе – hop

ответ

0

Возможно, что симулятор замерзает из-за необработанного исключения. Проверьте консоль отладки во время работы приложения. Наиболее вероятной причиной зависания вашего приложения является то, что нажатая кнопка может вызвать метод fedDog:. Попробуйте изменить метод подписи к этому:

- (IBAction)fedDog:(id)sender { 
    // your code 
} 
+0

вся цель в том, что fedDog: вызывается, нет? во всяком случае, неправильная подпись не вызовет исключения. – hop

+0

@hop: ну, на самом деле, это было бы. Это вызовет исключение «непризнанный селектор, отправленный экземпляру ...». Только явная проверка того, отвечает ли данный экземпляр на fedDog или fedDog: предотвратит выброс исключения. Хотя в данном конкретном случае ваша точка в arrayWithCapacity является более вероятной причиной проблемы. Я этого раньше не заметил. –

+0

извините, я пропустил толстую кишку, вчера вечером! вы правы, конечно! – hop

0

Для начала ваш метод действия должен принимать только один аргумент, а не один. Помимо этого, запустите его в отладчике?

+0

IBActions может иметь один аргумент или ни один. Насколько я знаю, оба действительны. –

0

Вы пытаетесь отправить arrayWithCapacity к экземпляру NSMutableArray, но на самом деле объявлен

+ (id)arrayWithCapacity:(NSUInteger)numItems 

и, следовательно, метод класса.

Так или использовать

NSMutableArray *dogsFedSave = [[NSMutableArray alloc] initWithCapacity:48]; 

или

NSMutableArray *dogsFedSave = [NSMutableArray arrayWithCapacity:48]; 

Последнее было бы лучше, так как это приводит к autoreleased объекта (и вы забыли все равно выпустить dogsFedSave ...)

+0

Хорошо. Я помещаю «+ (id) arrayWithCapacity: (NSUInteger) numItems » в файл заголовка. Одна вещь, которую я заметил (что я не думаю, что новый код вызвал), состоит в том, что в нижней части файла классов есть 4 предупреждения. 1) неполная реализация класса «feeddogviewcontroller» 2) определение метода для + arraywithcapacity не найдено 3) неполная реализация класса feeddogviewcontroller (снова) 4) определение метода для -fedDog не найдено. Если у вас есть какие-либо идеи относительно того, почему я получаю эти предупреждения, пожалуйста, дайте мне знать. Благодаря! – Yogi

+0

Зачем вам это делать ??? – hop

+0

Думаю, я немного смущен. Где находится «+ (id) arrayWithCapacity: (NSUInteger) numItems« предполагается? – Yogi