用于NSMutableArray的addObject不起作用

时间:2015-03-16 11:58:23

标签: ios objective-c nsmutablearray

@property (strong, nonatomic)NSMutableArray *billsArray;

- (void)viewDidLoad {
    [super viewDidLoad];

    self.billsUserDefault = [NSUserDefaults standardUserDefaults];
    self.billsArray = [[NSMutableArray alloc] init];
    self.billsArray = [self getBillsArray];

}


- (NSMutableArray *)getBillsArray {
    NSMutableArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"];
    return billsArr;
}


- (void)AddOneBill:(Bill *)bill {
    // add bill to array
    [self.billsArray addObject:bill];

    // store the new bill
    [self.billsUserDefault setObject:self.billsArray forKey:@"billArray"];
    [self.billsUserDefault synchronize];

    // reload the table view
    [self.billTableView reloadData];

}

addObject方法中的addOneBill:方法不起作用。

我搜索了同样的问题,其他人也遇到了这个问题。答案建议为可变数组添加[[NSMutableArray alloc] init]。我做了但不行。

5 个答案:

答案 0 :(得分:1)

getBillsArray方法中,添加mutableCopy调用以获取objectForKey的可变数组。因为来自NSUserDefaults的对象不可变。修改后的代码如下所示:

- (NSMutableArray *)getBillsArray {
    NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];
    return billsArr;
}

修改 您正在数组中添加自定义对象并尝试保存在NSUserDefaults中,这是不可能的。您需要将对象转换为NSDictionary对象,其中每个键值对将表示该对象的一个​​变量。如果自定义对象还包含自定义对象,则必须递归执行此转换步骤。

答案 1 :(得分:0)

尝试 NSMutableArray *billsArr = [[self.billsUserDefault objectForKey:@"billArray"] mutableCopy];

中的getBillsArray

答案 2 :(得分:0)

NSUserDefaults个对象不是不可变的。你必须使它们变得可变。

尝试以下代码。

NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]];

答案 3 :(得分:0)

- (void)viewDidLoad {
    [super viewDidLoad];

    self.billsUserDefault = [NSUserDefaults standardUserDefaults];
    self.billsArray = [[NSMutableArray alloc] init];
    self.billsArray = [self getBillsArray];

}

在viewDidLoad中,您调用getBillsArray。但是userDefauls中key-billArray的值是什么,你可以在viewController启动时得到什么?

在addOneBill方法中为此键设置数组。 所以在viewDidLoad中你创建了mutableArray: self.billsArray = [[NSMutableArray alloc] init];

然后将其设置为nil:  self.billsArray = [self getBillsArray];

答案 4 :(得分:0)

另一个解决方案:为了解释为什么它不起作用,请参阅Salman的答案(来自NSUserDefaults的返回值不可变)

- (void)viewDidLoad {
    [super viewDidLoad];

    self.billsUserDefault = [NSUserDefaults standardUserDefaults];
    self.billsArray = [[NSMutableArray alloc] init];
    [self.billsArray addObjectsFromArray: [self getBillsArray]];
}


- (NSArray *)getBillsArray {
    NSArray *billsArr = [self.billsUserDefault objectForKey:@"billArray"];
    return billsArr;
}

为了将'Bill'对象保存到NSUserDefaults中,如果它来自NSObject,你可以使用NSKeyedArchiver& NSKeyedUnarchvier:

//encode
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:your_bill_array];
//then save to NSUserDefaults 

//decode:   
id result = [NSKeyedUnarchiver unarchiveObjectWithData:data_returned_from_NSUSerDefaults];