我意识到有教程,但它们似乎永远不够深入。
现在,我有一个允许开发票的应用程序。但是,由于数据类型的动态特性,我将其作为 sharedObject 保存在主用户类中,而不是单独的类中。每张发票都包含在一个 中NSMutableDictionary
,它可以包含尽可能多或尽可能少的成员对象。有很多不同类型的发票,我们发现最好这样做。
我们现在遇到的问题是,当一张发票完成并创建另一张发票时,这些项目的 UI 似乎保留了以前的发票值,即使在发票末尾,我将其设置NSMutableDictionary
为 nil。
基本流程:通过几个不同顺序的视图控制器,我将输入到 NSTextFields 中的值设置为 NSStrings 作为主键的值NSMutableDictionary
,然后移动到下一个适当的屏幕。
这些NSTextFields
被声明为非原子的,强的。
它们的值设置为
[myNSMutableDictionary addObject:textField.value forKey:@"thisValue"];
因为 ARC,没有任何东西被明确释放,而且我小心翼翼地不分配和初始化任何东西。
每个屏幕都会onDidShow
为文本字段分配其在NSMutableDictionary
.
我所期望的是,在当前发票期间,没有文本字段将包含旧值,并且在成功将发票提交到云服务后,整个发票将被空白。从未存储在设备中(后台运行时除外)。
我得到了什么,作为设置的结果NSMutableDictionary
是屏幕似乎保留了它们以前的值,有时是 nil,但最常见的是以前发票的值。
是否有一种方便的方法可以将所有成员设置为零,或者我应该:
NSMutableDictionary
在我的 sharedManager 中声明为非原子的、强的,NSMutableDictionary
当我想要一个新的发票时分配/初始化发票,但将所有声明为非IBOutlets
原子的、弱的(因此在一个方向或另一个方向分配不保留),并确保我是否需要分配一个要添加到的对象NSMutableDictionary
,它们是否也被声明为弱?NSMutableDictionary
可能会发生,例如,我 需要将 NSArray 存储在
[myArray alloc] initWithObjects:value1, value2, nil]];
我的意思是,即使我将发票设置为 nil,value1 和 value2 似乎是僵尸,但在第二次通过代码后重新分配。
示例代码: 在 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?
}
我的问题; 由于@property(强,非原子)并且从不放手(因为似乎从未调用viewDidUnload),我的viewControllers(还有更多)无意中保留了值,这就是为什么数据似乎没有重新初始化,或者是因为当我添加新发票时,我实际上并没有重新实例化,而只是复制其他值?