簡體   English   中英

由於未捕獲的異常'NSUnknownKeyException',iOS終止應用

[英]iOS Terminating app due to uncaught exception 'NSUnknownKeyException'

我對目標c和iOS編程很新,我有這個非常奇怪的錯誤。 有問題的應用程序初始化一個NSMutableArray,其中包含一組使用NSObject生成的自定義類型的值。 這是由應用程序操縱。 如果在應用運行時添加了新值,則使用NSUserDefaults保存新值,並從NSUserDefaults啟動它們以及下一個應用程序打開時的默認值。

這是我得到的錯誤:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xb404> valueForUndefinedKey:]: this class is not key value coding-compliant for the key score.'
*** First throw call stack:
(0x1c9b012 0x10d8e7e 0x1d23fb1 0xb84d1d 0xaf100b 0xaf0fbd 0xb0f247 0xb3023c 0xb30056 0x3e40 0x3c5f 0x11f5ad 0x10ec705 0x202c0 0x20258 0x242ff4 0x10ec705 0x202c0 0x20258 0xe1021 0xe157f 0xe1056 0x246af9 0x10ec705 0x202c0 0x20258 0xe1021 0xe157f 0xe06e8 0x4fcef 0x4ff02 0x2dd4a 0x1f698 0x1bf6df9 0x1bf6ad0 0x1c10bf5 0x1c10962 0x1c41bb6 0x1c40f44 0x1c40e1b 0x1bf57e3 0x1bf5668 0x1cffc 0x290d 0x2835)
libc++abi.dylib: terminate called throwing an exception

我不太確定錯誤是什么或如何調試它。

以前這段代碼完美無缺,我所做的就是從預設的默認元素列表中刪除一兩個元素,並在模擬器中模擬刪除應用程序,並重新編譯代碼。 自從我的程序崩潰,上面的消息,我無法弄清楚如何解決它。

所以如果有人可以給我一些關於如何調試這個的幫助,那就太好了。 我可以根據需要附加代碼,我不確定哪些代碼與顯示相關,並且發布項目中涉及的所有代碼可能太多了。

用於編碼和解碼名為name.h的自定義Name NSObject類的屬性的代碼:

-(void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeObject:self.name forKey:@"name"];
    [encoder encodeInteger:self.score forKey:@"score"];

}

-(id)initWithCoder:(NSCoder *)decoder
{
    if((self = [super init]))
    {
        self.name = [decoder decodeObjectForKey:@"name"];
        self.score = [decoder decodeIntegerForKey:@"score"];
    }

    return self;
}

從類中檢索數據,這很重要,此代碼出現在appdelegate.m中:

NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"dataArray"];


NSInteger score = 0;


NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:@"name", nil];

NSMutableArray *tempList = [[NSMutableArray alloc] init];

for(NSString *y in temp)
{
    Name *name = [[Name alloc] init];
    name.name  = y;
    name.score = score;
    [tempList addObject:name];


}

if (data)
{

    NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithData:data];
   NSMutableArray *names = [[NSMutableArray alloc]initWithArray:list];
  // [_nameList addObjectsFromArray:temp];
    NSMutableArray *t = [[names arrayByAddingObjectsFromArray:tempList ] mutableCopy];

    _nameList = [[NSMutableArray alloc]init];

    [_nameList addObjectsFromArray:t];


}
else 
{
    //First time load or data is not saved yet
    _nameList = [[NSMutableArray alloc] initWithObjects:@"name", nil];

}

在關閉時保存數組:

- (void)applicationWillTerminate:(UIApplication *)application
{
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
NSData *data =[NSKeyedArchiver archivedDataWithRootObject:_nameList];


[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"dataArray"];
}

相同的代碼在applicationDidEnterBackground中。

用'得分'排序的代碼

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:    (UIViewController *)viewController
{


    if(viewController == _viewController3)
    {
        [self sortNames:_nameList];
        [[(ThirdViewController*)_viewController3 topList] reloadData];

    }
}

-(void)sortNames:(NSMutableArray*)test
{



NSArray* temp = [[NSArray alloc] initWithArray:test];


NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"score" ascending:NO];
NSArray *sortedLinks = [[temp sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]] mutableCopy];

_nameList = (NSMutableArray*) sortedLinks;
}

這是我的兩分錢。 你有這條線:

[encoder encodeObject:self.name forKey:@"name"];

然后這一行:

Name *name = [[Name alloc] init];

這讓我認為“self.name”屬性是這些“Name”自定義子類之一。

我相信如果你創建一個自定義子類並且你想要它使用encodewithcoder ,你必須將encodewithcoder方法添加到你的自定義子類中,並盡可能原始地將它的所有屬性和實例變量encodewithcoderencodewithcoder

這意味着,您的Name類需要有自己的encodewithcoder方法,該方法對其所有屬性和已存儲為工廠對象或c基元的實例變量進行編碼。

編輯:我仍然很新,很重視我的代表。 如果我錯了,請評論,我會刪除,但請不要忘記我遺忘

這里:

_nameList = [[NSMutableArray alloc] initWithObjects:@"name", nil];

您正在向_nameList數組添加NSString 稍后你保存該數組。 下次加載該數組時,其中包含NSString @"name" 我想在某些時候你遍歷_nameList的項目並嘗試獲取或設置score ,因為你在NSString的子類上調用它會得到NSUnknownKeyException

我想你想要的是用以下代碼替換上面的行:(假設你在上面提到的name.h文件中的類稱為Name

Name *newName = [[Name alloc] init]; //or initialize the way you need to
_nameList = [[NSMutableArray alloc] initWithObjects:newName, nil];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM