Я столкнулся с проблемой, которая сильно смущает меня, чтобы сказать вам правду.
У меня есть общий экземпляр MAOrders, который я получаю при первом запуске initWithNibName в конкретном контроллере представления.
Общий экземпляр сохраняется на устройстве с помощью NSFileManager, и все работает правильно. Я могу взять сохраненные данные и все такое, это не проблема, но это может повлиять на реальную проблему, так что имейте это в виду ...
Теперь все хорошо, переменная ordersController получает этот объект, и объект присваивается этой переменной.
Однако, когда я наконец представляю этот контроллер представления, переменная ordersController указывает на ничто, и это вызывает серьезный сбой.
Что бы это могло быть?
EDIT
Это то, что происходит. В initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundleOrNil
я выделяю ordersController
с общим экземпляром MAOrders
, который является пользовательским объектом NSObject.
Если я NSLog этот объект, я получаю следующее: <MAOrders: 0x6b3e080>
Теперь в viewDidAppear:(BOOL)animated
приложение вылетает. Затем я проверяю, чем ordersController равен, и получаю следующее: 0x6b3e080 does not appear to point to a valid object.
Куда я иду не так?
ДРУГОЕ РЕДАКТИРОВАНИЕ
Вот синглтон-код MAOrders.
//
// Created by Sebastien Peek on 3/11/11.
// Copyright (c) 2011 NetStart. All rights reserved.
//
#import "MAOrders.h"
#import "MAOrder.h"
@implementation MAOrders
@synthesize pastOrders, currentOrders;
static MAOrders *ordersState;
+ (id)sharedMAOrdersInstance {
@synchronized(self) {
if (!ordersState) {
NSLog(@"Order State");
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"Data"];
NSString *dataFileString = [dataPath stringByAppendingPathComponent:@"Orders.archive"];
NSData *data = [[NSData alloc] initWithContentsOfFile:dataFileString];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
[data release];
ordersState = [[unarchiver decodeObjectForKey:@"MAOrders"] retain];
[unarchiver finishDecoding];
[unarchiver release];
}
if (!ordersState) {
ordersState = [[MAOrders alloc] init];
}
}
return ordersState;
}
- (id)init {
if ([pastOrders count] == 0) {
pastOrders = [[NSMutableArray alloc] initWithObjects: nil];
}
if ([currentOrders count] == 0) {
currentOrders = [[NSMutableArray alloc] initWithObjects: nil];
}
return self;
}
- (void)addOrderToPastOrders:(MAOrder *)pastOrder {
[pastOrders addObject:pastOrder];
[self performSelector:@selector(postSaveNotification)];
}
- (void)removeOrderFromPast:(MAOrder *)removeOrder {
[pastOrders removeObject:removeOrder];
[self performSelector:@selector(postSaveNotification)];
// [removeOrder clearAllItems];
}
- (void)addOrderToCurrentOrders:(MAOrder *)currentOrder {
NSLog(@"Current Orders: %@", currentOrders);
[currentOrders addObject:currentOrder];
[self performSelector:@selector(postSaveNotification)];
}
- (void)removeOrderFromCurrent:(MAOrder *)removeOrder {
[currentOrders removeObject:removeOrder];
[self performSelector:@selector(postSaveNotification)];
// [removeOrder clearAllItems];
}
- (void)addOrderFromCurrentToPast:(MAOrder *)currentToPast {
[currentOrders removeObject:currentToPast];
[pastOrders addObject:currentToPast];
[self performSelector:@selector(postSaveNotification)];
}
- (void)postSaveNotification {
[[NSNotificationCenter defaultCenter] postNotificationName:@"ordersNeedToSave" object:nil];
}
- (void)dealloc {
}
#pragma mark NSCoding
#define kPastOrders @"pastOrders"
#define kCurrentOrders @"currentOrders"
- (void) encodeWithCoder:(NSCoder *)encoder {
NSLog(@"Orders Encoding");
[encoder encodeObject:pastOrders forKey:kPastOrders];
[encoder encodeObject:currentOrders forKey:kCurrentOrders];
}
- (id)initWithCoder:(NSCoder *)decoder {
NSLog(@"Orders Decoding");
if ((self = [super init])) {
pastOrders = [decoder decodeObjectForKey:kPastOrders];
currentOrders = [decoder decodeObjectForKey:kCurrentOrders];
NSLog(@"CURRENT ORDERS: %@", currentOrders);
NSLog(@"ORDER MENU NAME: %@", [[[currentOrders objectAtIndex:0] menu] name]);
NSLog(@"PAST ORDERS: %@", pastOrders);
}
return self;
}
@end
Это полный файл .m.