チュートリアルがあることはわかっていますが、十分に深くはないようです。
現在、請求書を発行できるアプリがあります。ただし、データ型の動的な性質により、これを単独のクラスではなく、メイン ユーザー クラスの sharedObject として保持します。各請求書は に含まれておりNSMutableDictionary
、メンバー オブジェクトをできるだけ多くまたは少なく含めることができます。請求書には非常に多くの種類があるため、この方法が最適であることがわかりました。
NSMutableDictionary
現在の問題は、1 つの請求書が作成され、別の請求書が作成されたときに、請求書の最後にを nilに設定したにもかかわらず、それらのアイテムの UI が以前の請求書の値を保持しているように見えることです。
基本的なプロセス: さまざまな順序でいくつかのビュー コントローラーを使用して、NSTextFields に入力された値を NSStrings として main のキーの値として設定NSMutableDictionary
し、次の適切な画面に移動します。
これらNSTextFields
は非アトミック、ストロングとして宣言されています。
それらの値は
[myNSMutableDictionary addObject:textField.value forKey:@"thisValue"];
ARC では何も明示的に解放されないため、何も割り当てたり初期化したりしないように注意しました。
各画面onDidShow
は、テキスト フィールドにそれぞれの値を割り当てますNSMutableDictionary
。
私が期待しているのは、現在の請求書ではテキスト フィールドに古い値が含まれず、請求書をクラウド サービスに正常に送信すると、請求書全体が空白になることです。デバイスに保存されることはありません (バックグラウンドの場合を除く)。
を nilに設定した結果として得られるのNSMutableDictionary
は、画面が以前の値、場合によっては nil を保持しているように見えることですが、ほとんどの場合、以前の請求書の値です。
すべてのメンバーを nil に設定する便利な方法はありますか?
NSMutableDictionary
私のsharedManagerでnonatomic、strongとして宣言し、新しいものが必要なときに請求書を割り当て/初期化NSMutableDictionary
しますが、すべてIBOutlets
をnonatomic、weakとして宣言します(したがって、一方向または他の方向への割り当ては保持されません)、必要があるかどうかを確認しますに追加するオブジェクトを割り当てますNSMutableDictionary
。それらは何らかの形で弱いものとして宣言されていますか? NSMutableDictionary
たとえば、NSArray をに 格納する必要がある場合があります。
[myArray alloc] initWithObjects:value1, value2, nil]];
私が言っているのは、請求書を nil に設定しても、value1 と value2 はゾンビ化されているように見えますが、コードを 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が呼び出されないように見えるため)、それがデータが再初期化されないように見える理由です。新しい請求書を追加するとき、実際には再インスタンス化しませんが、他の値をコピーするだけですか?