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'