【问题标题】:mutating method sent to immutable object发送到不可变对象的变异方法
【发布时间】:2011-08-13 00:57:34
【问题描述】:

当我第一次使用这个方法时它工作正常,但是当我第二次调用它时,我得到错误“发送到不可变对象的变异方法”。问题在于“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];

}

【问题讨论】:

  • 问题在于placesT 初始化。我敢打赌,NSUserDefault 标准第一次是空的,然后进入第二次初始化。你也有内存泄漏。
  • 请注意,您可能只能将[NSString stringWithFormat:@"%@", tagF.text] 替换为tagF.text。如果text 已经是NSString,则无需发送+stringWithFormat:

标签: ios objective-c cocoa cocoa-touch


【解决方案1】:

placesT 是一个非可变数组,要么始终将placesT 设置为可变对象,要么使用以下代码。

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

【讨论】:

    【解决方案2】:

    这应该可行:

    -(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]; }
    

    【讨论】:

      【解决方案3】:

      那是因为 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];
      }
      

      【讨论】:

        【解决方案4】:

        正如 NSUserDefaults 的文档所说:“从 NSUserDefaults 返回的值是不可变的,即使您将可变对象设置为值。”每当您想更改从 NSUserDefaults 获得的集合时,您必须获取不可变版本,创建 mutableCopy,修改它,然后重新设置。

        【讨论】:

        • 添加到这个例如: someMutableArray = [yourArrayFromDictionary mutableCopy];希望有所帮助:)
        猜你喜欢
        • 2016-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多