我意識到有教程,但他們似乎從來沒有深入過。ARC引起我的疼痛
現在,我有一個允許開發票的應用程序。但是,由於數據類型的動態特性,我將它作爲主用戶類中的共享對象,而不是它自己的類。每張發票都包含在一個NSMutableDictionary
中,其中可以包含儘可能多或最少的成員對象。有這麼多不同類型的發票,我們發現最好這樣做。
現在的問題是,當一張發票已完成,另一張已創建,這些物品的UI似乎仍保留以前的發票值,即使在發票末尾,我也將NSMutableDictionary
設置爲零。
基本過程:通過幾個不同順序的視圖控制器,我將NSSextFields中的值輸入設置爲NSStrings作爲主要參數NSMutableDictionary
中的鍵值,然後移至下一個適當的屏幕。
這些NSTextFields
被聲明爲非原子,強。
它們的值設置與
[myNSMutableDictionary addObject:textField.value forKey:@"thisValue"];
因爲ARC,沒有明確釋放,我已經做了精心的不alloc和初始化什麼。
每個屏幕onDidShow
分配文本字段與其各自的值在NSMutableDictionary
。
我期望的是,在當前發票期間,沒有任何文本字段會包含舊值,並且在成功將發票提交給雲服務時,整個發票都將被清空。從未存儲在設備中(除了背景時)。
作爲將NSMutableDictionary
設置爲零的結果,我得到的結果是屏幕似乎保留了以前的值,有時爲零,但最常見的是前一張發票的值。
有一個方便的方法來設置所有成員爲零,或者我應該:
聲明NSMutableDictionary
作爲非原子,強於我的sharedManager,分配/初始化發票NSMutableDictionary
時,我想一個新的,但聲明所有IBOutlets
作爲非原子,弱(如此分配在一個方向或其他不保留),並確保如果我確實需要分配一個對象被添加到NSMutableDictionary
,他們被宣佈爲弱?它可能出現的例如,我需要存儲一個NSArray在NSMutableDictionary
,我
[myArray alloc] initWithObjects:value1, value2, nil]];
我在說什麼,就是即使我設置發票零,值1和值2似乎zombied,但經過重新分配的第二次傳遞代碼。
示例代碼:在User.h ,我有一個屬性:
@property (nonatomic, strong) NSMutableDictionary *currentInvoice;
用戶。
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];
(順便說一句,我想我解決我的問題,爲m,我的 'init' 的方法中實例化我從來沒有重新實例化一個新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似乎永遠不會被調用),這就是爲什麼數據似乎沒有重新啓動,或者是因爲當我添加新的發票時,我實際上沒有重新實例化,只是複製其他值?
你能顯示一些代碼嗎?閱讀這樣的文字牆很難。 –
你確定你的問題實際上與ARC有關嗎?也許你只需要在每一個屏幕上重新加載數據,如果它改變了。也許使用NSNotificationCenter發送一個通知給它需要更新的所有可見屏幕,無論何時發票被更改/刪除等等。 –
你是什麼意思,「我已經小心地不分配和初始化任何東西」?你仍然需要用ARC來分配和初始化你的對象。 – Monolo