1

我意识到有教程,但它们似乎永远不够深入。

现在,我有一个允许开发票的应用程序。但是,由于数据类型的动态特性,我将其作为 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(还有更多)无意中保留了值,这就是为什么数据似乎没有重新初始化,或者是因为当我添加新发票时,我实际上并没有重新实例化,而只是复制其他值?

4

1 回答 1

2

没有太多代码,看起来这与 ARC 没有任何关系,因此修改@property声明(即strongto weak)将没有任何影响。

听起来您从中填充 UI 的“数据源”是一个NSMutableDictionary. 听起来您正在将此字典设置为nil然后将其分配给NSMutableDictionary包含新发票数据的新字典。这听起来很可靠。

但是,更改 的值NSMutableDictionary不会自动修改您的 UI 元素的值(例如self.textLabel.text)。UITableView您将需要一个功能与'方法类似的reloadData方法,因为您在更新数据源(即字典)时调用它,并相应地管理更新 UI。

因此,这似乎与 ARC 无关,而是与对象的自然行为有关,例如UILabel.

希望这可以帮助...

于 2013-10-08T19:24:33.333 回答