Я понимаю, что есть учебники, но они, кажется, никогда не углубляются.
Сейчас у меня есть приложение, которое позволяет выставлять счета. Однако из-за динамического характера типов данных я сохраняю это как общий объект в основном пользовательском классе, а не как отдельный класс. Каждый счет-фактура содержится в NSMutableDictionary
, который может содержать как можно больше или меньше объектов-членов. Существует так много разных типов счетов-фактур, что мы решили, что лучше всего сделать это.
Проблема, с которой мы столкнулись сейчас, заключается в том, что когда один счет-фактура выполнен, а другой создан, пользовательский интерфейс для этих элементов, похоже, сохраняет предыдущие значения счета-фактуры, хотя в конце счета-фактуры я установил NSMutableDictionary
на ноль.
Базовый процесс: с помощью нескольких контроллеров представления в различной последовательности я устанавливаю входное значение в NSTextFields как NSStrings как значения для ключей в основном NSMutableDictionary
и перехожу к следующему соответствующему экрану.
Эти NSTextFields
объявлены неатомарными, сильными.
Их значения устанавливаются с
[myNSMutableDictionary addObject:textField.value forKey:@"thisValue"];
Поскольку в ARC ничего не высвобождается явно, я позаботился о том, чтобы ничего не выделять и не инициализировать.
Каждому экрану onDidShow
присваиваются текстовые поля с соответствующим значением в NSMutableDictionary
.
Я ожидаю, что во время текущего счета текстовые поля не будут содержать старые значения, а при успешной отправке счета в облачную службу весь счет будет пуст. Никогда не сохраняется на устройстве (за исключением фонового режима).
Что я получаю в результате установки NSMutableDictionary
на ноль, так это то, что экраны, кажется, сохраняют либо свои предыдущие значения, иногда ноль, но чаще всего значение предыдущего счета.
Есть ли удобный метод для установки всех членов на ноль, или я должен:
Объявите NSMutableDictionary
неатомарным, сильным в моем общем менеджере, Alloc/Init счет-фактура NSMutableDictionary
, когда я хочу новый, но объявите все IBOutlets
неатомарным, слабым (чтобы назначения в одном или другом направлении не сохранялись) и убедитесь, что я нужно ли выделять объект для добавления в NSMutableDictionary
, чтобы они как-то тоже объявлялись слабыми? Может случиться так, что, например, мне нужно сохранить NSArray в NSMutableDictionary
, я
[myArray alloc] initWithObjects:value1, value2, nil]];
Я хочу сказать, что даже если я установил счет-фактуру равным нулю, значение1 и значение2 кажутся зомбированными, но переназначаются после второго прохода кода.
Пример кода: в User.h у меня есть свойство:
@property (nonatomic, strong) NSMutableDictionary *currentInvoice;
в User.m я создаю экземпляр во время метода «init»:
currentInvoice = [[NSMutableDictionary alloc] initWithCapacity:1];
При создании нового счета (в InvoiceViewController.m):
User *userInfo = [User sharedManager];
userInfo.currentInvoice = [NSMutableDictionary dictionaryWithObjectsAndKeys:
_clientId, @"clientId",
_clientType, @"clientType",
_txtClientName.text, @"clientName",
keyContactName, @"keyContactId",
orderTypeNum, @"orderType",
_keyContact.text, @"keyContact",
_problemDescription.text, @"problemDescription",
_dateOfService.text, @"startDate",
_startTime.text, @"startTime",
_endTime.text, @"endTime", nil];
(Кстати, я думаю, что решил свою проблему, так как я никогда не создаю новый экземпляр userInfo.currentInvoice, просто копирую старый, его члены, не упомянутые здесь, вероятно, все еще в такт)
В другом месте InvoiceViewController.m метод, который фактически отменяет процесс выставления счета:
- (IBAction) dismissViewController:(id)action: {
User *userInfo = [User sharedManager];
userInfo.currentInvoice = nil;
}
В InvoiceStepTwoViewController.m другой контроллер с другими аспектами того же счета:
@property (strong, nonatomic) IBOutlet UILabel *clientName; // in the .h, of course
@property (strong, nonatomic) IBOutlet UITextView *textView; // in .h, used to capture data
- (void)viewDidAppear {
User *userInfo = [User sharedManager];
_clientName.text = [userInfo.currentInvoice objectForKey:@"clientName"];
}
После небольшого изменения и захвата значений,
- (IBAction)finishStepTwo:(id)sender {
[userInfo.currentInvoice addEntriesFromDictionary:[NSDictionary dictionaryWithObjectsAndKeys:_textView.text, @"nerdspeak", nil]]; // so that NSMutableDictionary.currentInvoice objectForKey:@"nerdspeak" will contain _textView.text's value... but will currentInvoice own this object now? Will invoiceStepTwoViewController retain this as long as is possible?
}
Мой вопрос; мои viewControllers (их намного больше) непреднамеренно сохраняют значения из-за @property (сильное, неатомарное) и никогда не отпускают (потому что viewDidUnload никогда не вызывается), и поэтому данные, кажется, не повторно инициализируются, ИЛИ это потому, что когда я добавляю новый счет, я на самом деле не восстанавливаю, а просто копирую другие значения?