【问题标题】:Need help with iphone sdk: not correctly saving .plist to documents directory需要有关 iphone sdk 的帮助:未正确将 .plist 保存到文档目录
【发布时间】:2009-12-27 08:25:50
【问题描述】:

我花了太长时间试图找出问题所在,所以我希望她能帮助我。

我的代码:

- (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 目录中没有文件出现。

【问题讨论】:

  • 一个问题不要问两个不相关的问题

标签: iphone sdk nsmutablearray nsarray nsdictionary


【解决方案1】:

模拟器可能因为未处理的异常而死机。在您的应用程序运行时检查调试控制台。 您的应用程序挂起的最可能原因是按下的按钮可能正在调用fedDog: 方法。尝试将您的方法签名更改为这个:

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

【讨论】:

  • 整个目的是调用 fedDog:,不是吗?无论如何,错误的签名实际上不会导致异常。
  • @hop:嗯,实际上,它会的。它会引发异常“无法识别的选择器发送到实例......”。只有明确检查给定实例是否响应 fedDog 或 fedDog: 才能防止抛出异常。虽然,在这种特殊情况下,您关于 arrayWithCapacity 的观点是问题的更可能原因。我之前没注意到。
  • 对不起,我昨晚错过了结肠!你是对的,当然!
【解决方案2】:

对于初学者,您的操作方法应该采用单个参数而不是无参数。除此之外,您是否在调试器中运行过它?

【讨论】:

  • IBAction 可以有一个参数,也可以没有。据我所知,两者都是有效的。
【解决方案3】:

您正试图将arrayWithCapacity 发送到 NSMutableArray 的一个实例,但它实际上被声明为

+ (id)arrayWithCapacity:(NSUInteger)numItems

因此是一个类方法。

所以要么使用

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

NSMutableArray *dogsFedSave = [NSMutableArray arrayWithCapacity:48];

后者会更好,因为它会产生一个自动释放的对象(而且你还是忘了释放 dogFedSave……)

【讨论】:

  • 好的。我将“+ (id)arrayWithCapacity:(NSUInteger)numItems”放在头文件中。我注意到的一件事(我认为不是新代码引起的)是类文件底部有 4 个警告。 1)“feeddogviewcontroller”类的不完整实现 2)+arraywithcapacity 的方法定义未找到 3)feeddogviewcontroller 类的不完整实现(再次) 4)-fedDog 的方法定义未找到。如果您对我收到这些警告的原因有任何想法,请告诉我。谢谢!
  • 我觉得我有点困惑。 “+ (id)arrayWithCapacity:(NSUInteger)numItems ”应该去哪里?
  • 无处可去。我说的是“它被宣布”而不是“你必须宣布”,不是吗?
  • 对不起,那是我的错误。无论如何,我将“NSMutableArray *dogsFedSave = [[NSMutableArray alloc] arrayWithCapacity: 48];”更改为“NSMutableArray *dogsFedSave = [NSMutableArray arrayWithCapacity:48];”虽然仍然没有创建 plist,但我继续得到.m 文件末尾的两个警告(1)未找到 -fedDog 的方法定义 2)类“feeddogviewcontroller”的不完整实现)。有什么想法吗?
  • 没有足够的上下文来调试其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多