2013-10-08 42 views
1

我意識到有教程,但他們似乎從來沒有深入過。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似乎永遠不會被調用),這就是爲什麼數據似乎沒有重新啓動,或者是因爲當我添加新的發票時,我實際上沒有重新實例化,只是複製其他值?

+1

你能顯示一些代碼嗎?閱讀這樣的文字牆很難。 –

+3

你確定你的問題實際上與ARC有關嗎?也許你只需要在每一個屏幕上重新加載數據,如果它改變了。也許使用NSNotificationCenter發送一個通知給它需要更新的所有可見屏幕,無論何時發票被更改/刪除等等。 –

+4

你是什麼意思,「我已經小心地不分配和初始化任何東西」?你仍然需要用ARC來分配和初始化你的對象。 – Monolo

回答

2

沒有太多的代碼從它看起來像這與ARC沒有任何關係,因此修改@property聲明(即strongweak)將不會產生任何影響。

這聽起來像你的「數據源」你的用戶界面是填充NSMutableDictionary。這聽起來像是您將此字典設置爲nil,然後將其分配給包含新發票數據的新NSMutableDictionary。這聽起來很可靠。

但是,更改NSMutableDictionary的值不會自動修改UI元素的值(例如self.textLabel.text)。您將需要一種類似於UITableViewreloadData方法的方法,因爲您在更新數據源(即您的字典)時調用它,並管理相應的UI更新。

所以,看起來這不像是ARC相關的,而是與像UILabel這樣的對象的自然行爲有關。

希望這有助於...

+0

標記爲答案,因爲我意識到我沒有完全將它設置爲零,並重新分配新的NSMutableDictionary。我在User.h中添加了initInvoice,deleteInvoice和restoreInvoiceFromPlist方法,以便只有User.m負責管理currentInvoice對象的生命週期,而不是任何其他viewController。這應該減輕任何自我對所有權的混淆。 –