У меня есть объект данных, который я хочу хранить, получать доступ и изменять по своему желанию между всеми различными представлениями приложения iOS. Ниже представлен базовый дизайн. Что интригует ко мне, так это то, что если я заменил NSMutableArray на NSString, все это работает, неважно, но в тот момент, когда я делаю его массивом и сохраняю в нем строку, он волнуется. Я выбрал массив, потому что мне нужно хранить разные версии userData в одно и то же время и в реальном приложении, есть намного больше, чем только одна переменная пользовательских данных.Почему я теряю свои объекты в NSMutableArray в функции prepareForSegue? Сбой
Я использую 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'
Почему вы заново изобретаете 'NSArray'? –
Связано ли это с другим вопросом? Я посмотрел на ваш код там, и вы вызывали removeAllObjects на своих массивах, прежде чем пытались вызвать replaceObjectAtIndex: withObject :. Вы делаете то же самое здесь? – rdelmar
Я согласен с rdelmar, что проблема лежит в другом месте. Однако в ответ на ваш вопрос, касающийся лучших практик ARC, я бы предложил вместо 'assign' использовать' strong', а не 'keep' и' weak'. Кроме того, почему вы хотите, чтобы 'Num' был' assign'/'weak'? Если вы хотите, чтобы ваш объект 'Data' сохранил его, вы, вероятно, хотите, чтобы это было« сильным ». – Rob