Я тоже так думаю сейчас. Сначала я хотел использовать словари, но потом вспомнил, что мне понадобятся CGRects в моем приложении, что было бы другой проблемой, потому что я не мог их так легко хранить в своих NSUserDefaults в словаре.

ТИРОВАТЬ: Вот рабочая версия. Мне удалось получить свой объект в NSMUtableArray после того, как я сохранил и загрузил его из NSUserDefaults через NSCoding. Я думаю, что важно упомянуть, что вам нужно не только деархивировать массив, но и весь его контент. Как вы можете видеть, мне пришлось хранить не только NSData моего объекта замораживания, но и NSData моего массива:

// My class "Freeze"
@interface Freeze : NSObject <NSCoding> // The NSCoding-protocoll is important!!
{
    NSMutableString *name;
}
@property(nonatomic, copy) NSMutableString *name;

-(void) InitString;
@end

@implementation Freeze
@synthesize name;

-(void) InitString {
    name = [[NSMutableString stringWithString:@"Some sentence... lalala"] retain];
}

// Method from NSCoding-protocol
- (void)encodeWithCoder:(NSCoder *)encoder
{
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.name forKey:@"name"];

}

// Method from NSCoding-protocol
- (id)initWithCoder:(NSCoder *)decoder
{
    self = [super init];
    if( self != nil )
    {
        //decode properties, other class vars
        self.name = [decoder decodeObjectForKey:@"name"];

    }
    return self;
}
@end




Freeze *freeze;
NSMutableArray *runes;
NSMutableArray *newRunes;


runes = [[NSMutableArray alloc] init];
newRunes = [[NSMutableArray alloc] init];

freeze = [[Freeze alloc] init];
[freeze InitString];
[runes addObject:freeze];

[self saveState];
[self restoreState];

Freeze *newFreeze = [[Freeze alloc] init];
newFreeze = [newRunes objectAtIndex:0];
NSString *String = [NSString stringWithString:newFreeze.name];
NSLog(@"%@", String);

//-----------------------------------------------------------------------------

- (void) saveState 
{    
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

    NSData* myClassData = [NSKeyedArchiver archivedDataWithRootObject:freeze];
    [defaults setObject:myClassData forKey:@"MyClass"];

    NSData* myClassArrayData = [NSKeyedArchiver archivedDataWithRootObject:runes];
    [defaults setObject:myClassArrayData forKey:@"MyClassArray"];

}

- (void) restoreState 
{    
    NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];

    NSData* myClassData = [defaults objectForKey:@"MyClass"];
    freeze = [NSKeyedUnarchiver unarchiveObjectWithData:myClassData];

    NSData* myClassArrayData = [defaults objectForKey:@"MyClassArray"];    
    NSArray *savedMyClassArray = [NSKeyedUnarchiver unarchiveObjectWithData:myClassArrayData];
    if( savedMyClassArray != nil ) 
        newRunes = [[NSMutableArray alloc] initWithArray:savedMyClassArray];    
    else
    newRunes =  [[NSMutableArray alloc] init];
}

РЕДАКТИРОВАТЬ: Это ошибка, которую я получил раньше, она больше не отображается с обновленной версией выше.

Сбой в самом конце, и отладчик выдает следующую ошибку:** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «- [NSConcreteMutableData InitString]: нераспознанный селектор, отправленный экземпляру 0x6b1fe20» *

Кроме того, он говорит, что «NewFreeze» не имеет типа CFString. Кто-нибудь знает, что происходит? Я действительно хочу сохранить мои объекты, как это.

Ответы на вопрос(2)

Ваш ответ на вопрос