-1

iOS アプリケーションのすべての異なるビュー間で自由に保存、アクセス、および変更したいデータ オブジェクトがあります。基本的な設計前提を以下に示します。私にとって興味深いのは、NSMutableArray を NSString に置き換えると、すべてが機能し、大したことではありませんが、それを配列にしてその中に文字列を格納した瞬間に異常が発生することです。同時に異なるバージョンの userData を保存する必要があり、実際のアプリにはユーザー データ変数が 1 つだけではないため、配列を選択しました。

私は ARC を使用していますが、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 クラスの共有インスタンスを取得し、そのクラスの init コードですべての配列をインスタンス化します。次に、準備のためにセグエを実行して初期に移動するときに、それらの配列に空の文字列を追加します。問題があるのは、次のコントローラーである Initial にあります。ビューが表示された直後に発生する didMoveToParentViewController で、これらの配列に対して removeAllObjects を呼び出します。次に、prepareForSegue で TDC に移動するときに、replaceObjectAtIndex:withObject: を使用しようとします。これらの配列を空にしただけなので、もちろんアプリがクラッシュします。

于 2013-04-14T03:31:46.587 に答える