【问题标题】:NSMutableArray with custom object invalid attributes具有自定义对象无效属性的 NSMutableArray
【发布时间】:2011-09-16 11:59:30
【问题描述】:

我在 NSUserDefault 中保存了一个带有自定义对象的 nsmutable 数组。但是当我检索对象时,我得到了一个包含对象的数组,但是当我尝试遍历对象时,应用程序崩溃并且在本地调试器中我变得无效

CFStringRef 和日志 -[消息标题]:无法识别的选择器发送到实例 0x187900。

我的自定义对象遵循 NSCoding 协议,如果我打印出数组,则以十六进制显示对象和内存分配。

我的消息。我已将名称更改为用于测试的属性:

  #import "Message.h"

  @implementation Message
  @synthesize tittel, adresse, dato;
  static NSString *titleKey = @"title";
  static NSString *urlKey = @"url";
  static NSString *dateKey = @"date";

 - (id)initWithCoder:(NSCoder *)decoder {
    self = [super init];
    if (self != nil) {
      self.tittel = [decoder decodeObjectForKey:titleKey];
       self.adresse = [decoder decodeObjectForKey:urlKey];
      self.dato = [decoder decodeObjectForKey:dateKey];
   }
   return self;
}   

- (void)encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:self.tittel forKey:titleKey];
[encoder encodeObject:self.adresse  forKey:urlKey];
[encoder encodeObject:self.dato forKey:dateKey];

 }

-(void)dealloc{

[dato release];
[tittel release];
[adresse release];
[super dealloc];
}
@end

我保存并尝试检索对象的方法:

-(void)saveToFile:(NSMutableArray *)incoming{

NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
if (standardUserDefault) {

    [standardUserDefault setObject:[NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithArray:incoming]] forKey:@"Messages"];
    [standardUserDefault synchronize];
}

 NSLog(@"Messages array saved. (%d message in array)",[incoming count]);

}
-(NSMutableArray*)returnFromFile{

NSUserDefaults *standardUserDefault = [NSUserDefaults standardUserDefaults];
NSData * dataCheck = [[NSData alloc]initWithData:[standardUserDefault objectForKey:@"Messages"]];

NSMutableArray *retro;
if(dataCheck != nil){
    NSArray *load = [NSKeyedUnarchiver unarchiveObjectWithData:dataCheck];
    if(load != nil){
        retro = [NSMutableArray arrayWithArray:load];
    }
    else
        retro = [[NSMutableArray alloc]init];
}
NSLog(@"Checking saved array (%d assignments in array)",[retro count]);

for(Message *m in retro){
   NSLog(@"%@", m.tittel);   //It crash here. 

}

return retro;

}

【问题讨论】:

  • 你的班级Message有财产title吗?
  • 在将数组添加到 NSUserDefults 之前,您能否在数组上执行相同的操作(从 userDefaults 取回后尝试的任何操作)?
  • 我用 message.adresse 尝试了同样的结果。
  • @Nekto:是的,它有。我试图在整行上更改名称以进行测试,并给我同样的问题。
  • 如果你只记录 m,而不是 m.tittel,你会看到什么?

标签: iphone nsstring nsuserdefaults nsobject nscoding


【解决方案1】:

我解决了!

刚开了一个新班,几乎一样。唯一的区别是我使用了标准的 init 方法来启动所有属性和 initWithCoder。它奏效了。如果 gcc 有错误,或者我尝试编译一个不遵循继续显示相同错误的协议的类,它会在此之前发生。有时它有助于创建完全相同或具有轻微差异的东西并编译。看起来编译器并不总是刷新内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多