Общий экземпляр пользовательского NSObject по какой-то причине потерян - PullRequest
0 голосов
/ 09 ноября 2011

Я столкнулся с проблемой, которая сильно смущает меня, чтобы сказать вам правду.

У меня есть общий экземпляр 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.

1 Ответ

1 голос
/ 09 ноября 2011

Единственная причина, которая может вызвать эту проблему, - несбалансированное количество сохранений и выпусков.Возможно, когда вы создаете общий экземпляр MAObject, он автоматически высвобождается и освобождается после вызова initWithNib ... или вы можете назначить общий экземпляр MAObject, не сохраняя его, а затем освободить его.

Невозможноскажем без реального кода.Просто найдите все места, где вызывается общий MAObject, и проверьте сохранение / освобождение вызовов.Вы также можете установить точку останова внутри dealloc объекта MAObject и посмотреть, где он фактически уничтожен.

...