1

以下は、データのアーカイブを解除するために使用するコードです。

- (id)initWithCoder:(NSCoder *)decoder
{
    if((self = [super init]))
    {
        NSString *resoureItemClassName = NSStringFromClass([ResourceItem class]);
        self.selectedItemClassName=[decoder decodeObjectForKey:@"selectedItemClassName"];
        Class class = NSClassFromString(selectedItemClassName);
        id temp = nil;

        if(class)
        {      
            temp = [[class alloc] init];
        }

        if(temp)
        {
            if([temp isKindOfClass:[NSString class]])
            {
                self.selectedString = [decoder decodeObjectForKey:@"selectedString"];;
                self.ID = selectedString;
            }
            else if([selectedItemClassName isEqualToString:resoureItemClassName])
            {  
                DLog(@"Resource item")
            }

            [temp release];                         
        }
        else
        {    
            self.ID = nil;
        }
    }

    return self;
}

tempObject を解放すると、アプリがクラッシュします。やらなければ漏れです。オートリリース方式を使ってみました。それでも、それはクラッシュしましたか?解決策は何ですか?

アップデート:

selectedItemClassName のエンコードされたデータは、__NSCFConstantString または __NSCFString のいずれかです。クラッシュは __NSCFString でのみ発生し、クラス名として __NSCFConstantString では発生しません。

その理由は何ですか?

4

1 に答える 1

0

どうですか:

- (id)initWithCoder:(NSCoder *)decoder
{
    if((self = [super init]))
    {
        NSString *resourceItemClassName = NSStringFromClass([ResourceItem class]);
        self.selectedItemClassName=[decoder decodeObjectForKey:@"selectedItemClassName"];
        Class class = NSClassFromString(selectedItemClassName);

        if(class)
        {      
            NSString *stringClassName = NSStringFromClass([NSString class]);
            if([stringClassName isEqualToString:self.selectedItemClassName])
            {
                self.selectedString = [decoder decodeObjectForKey:@"selectedString"];;
                self.ID = selectedString;
            }
            else if([self.selectedItemClassName isEqualToString:resourceItemClassName])
            {  
                DLog(@"Resource item")
            }
        }
        else
        {    
            self.ID = nil;
        }
    }

    return self;
}
于 2012-11-30T00:59:32.377 に答える