-1

我有一个数据对象,我希望在我的 iOS 应用程序的所有不同视图之间随意存储、访问和修改。基本设计前提如下图所示。让我感兴趣的是,如果我用 NSString 替换 NSMutableArray,一切正常,没什么大不了的,但是当我把它变成一个数组并在其中存储一个字符串时,它就吓坏了。我选择了一个数组,因为我需要同时存储不同版本的 userData,而在实际的应用程序中,不仅仅是一个用户数据变量。

我正在使用 ARC,但我不得不承认我不清楚我是否正确使用它。建议表示赞赏。

//  data.h

@interface Data : NSObject

@property (nonatomic, retain) NSMutableArray *data;
@property (assign) NSNumber *Num; // determines which "level" on the array we're accessing

+(id) sharedInstance;

@end



// data.m

+(id) sharedInstance
{    
    static id sharedInstance = nil;
    if (sharedInstance == nil) {
        sharedInstance = [[self alloc] init];        
    }
    return sharedInstance;
}

- (id)init
{
    self = [super init];

    if (self)
    {        
        _Num = [NSNumber numberWithInt:0];
        _data = [NSMutableArray array];
    }

    return self;
}

// userInput.h

@property (strong, nonatomic) IBOutlet UITextField *userData;

@property (nonatomic, retain) Data *dataStore;

在这里,我向我的数据对象添加了一个空字符串,因为没有任何用户输入是强制性的,但是当没有输入时我需要知道这一点,所以我至少使用一个空字符串。

// userInput.m

viewDidLoad
{
    _dataStore = [Data sharedInstance];
            [_dataStore.data addObject:@""];

}

prepareForSegue
{
    int num = [_dataStore.Num intValue];

    NSString *transferData = [NSString stringWithFormat:@"%@", _userData.text];
    [_dataStore.data replaceObjectAtIndex:num withObject:transferData]; // crash at this line. replacing the empty string with whatever the user inputs
}

崩溃报告

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM replaceObjectAtIndex:withObject:]: index 0 beyond bounds for empty array'
4

1 回答 1

1

你的控制器进程的顺序是这样的:

ViewController ---> 初始 ---> TDC

您可以在 ViewController 的 viewDidLoad 方法中获得 FlightData 类的共享实例,并且该类中的初始化代码会实例化您的所有数组。然后,当您执行 prepareForSegue 以转到 Initial 时,将空字符串添加到这些数组中。问题出在下一个控制器 Initial 中。您在 didMoveToParentViewController 中的这些数组上调用 removeAllObjects,这会在视图出现后立即发生。然后在 prepareForSegue 去 TDC 中,您尝试使用 replaceObjectAtIndex:withObject: 这当然会使应用程序崩溃,因为您刚刚清空了这些数组。

于 2013-04-14T03:31:46.587 回答