2011-04-26 44 views
13

當我第一次使用這個方法時,它工作正常,但是當我第二次調用它時,我得到錯誤「mutating method sent to immutable object」。問題符合「addObject」命令。發送給不可變對象的變異方法

-(IBAction) save: (id) sender{ 

NSMutableArray *placesT= [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; 

}

+0

那麼問題是與地方的初始化。我敢打賭,NSUserDefault標準第一次是空的,並進入第二次初始化。你也有內存泄漏。 – Radu 2011-04-26 13:06:35

+0

請注意,您可能只能用'tagF.text'替換'[NSString stringWithFormat:@「%@」,tagF.text]'。如果'text'已經是'NSString',則不需要發送'+ stringWithFormat:'。 – 2011-04-26 23:21:00

回答

24

至於在NSUserDefaults的文件說:「從返回的NSUserDefaults的價值觀是不變的,即使你設置了可變對象的價值。」每當你想改變你從NSUserDefaults得到的集合時,你必須得到不可變的版本,製作一個mutableCopy,修改並重新設置它。

+2

添加到這將是例如:someMutableArray = [yourArrayFromDictionary mutableCopy];希望幫助:) – jimbob 2013-01-04 02:03:23

10

這是因爲存儲在NSUserDefaults中的對象不是mutableArray而是普通數組。

- (IBAction)save:(id)sender { 

    NSMutableArray *placesT = nil; 
    NSArray *tempArray = [[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"]; 

    if (tempArray) { 
     placesT = [tempArray mutableCopy]; 
    } else { 
     placesT = [[NSMutableArray alloc] init]; 
    } 

    [placesT addObject:[NSString stringWithFormat:@"%@", tagF.text]]; 

    NSUserDefaults *tUD = [NSUserDefaults standardUserDefaults]; 
    [tUD setObject:placesT forKey:@"placesT"]; 
    [tUD synchronize]; 

    [self dismissModalViewControllerAnimated:YES]; 
    [placesT release]; 
} 
+0

你正在泄漏的副本。 – smorgan 2011-04-26 13:22:16

+0

@smorgen,你是完全正確的。 – rckoenes 2011-04-26 13:25:22

3

placesT是非可變數組,要麼始終設置placesT可變對象總是或使用以下代碼。

NSMutableArray *placesT= [[[NSUserDefaults standardUserDefaults] objectForKey:@"placesT"] mutableCopy]; 
0

這應該工作:

- (IBAction爲)保存:(ID)發送{

NSMutableArray *placesT= [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] 

objectForKey:@ 「placesT」]];

if (!placesT) { 
    placesT=[[[NSMutableArray alloc] init] autorelease]; 
} 

[placesT addObject: [NSString stringWithFormat:@"%@", tagF.text] ]; 

NSUserDefaults *tUD=[NSUserDefaults standardUserDefaults]; 
[tUD setObject:placesT forKey:@"placesT"]; 
[tUD synchronize]; 

[self dismissModalViewControllerAnimated:YES]; } 
相關問題