NSMutableArray 的 addObject 不起作用

addObject for NSMutableArray not working

@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];

}

addOneBill:方法中的addObject方法无效

我google过同样的问题,其他人也遇到了这个问题。建议为可变数组添加 [[NSMutableArray alloc] init] 的答案。我做了但没有用。

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

NSUserDefaults 对象不是不可变的。你必须让它们可变。

试试下面的代码。

NSMutableArray *billsArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"billArray"]];
- (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 分配] 初始化];

然后在此处将其设置为零: self.billsArray = [self getBillsArray];

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

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

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

另一个解决方案:关于它为什么不起作用的解释,请参阅 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];