Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 获得;“发送到不可变对象的变异方法”;错误_Iphone_Objective C_Nsmutablearray - Fatal编程技术网

Iphone 获得;“发送到不可变对象的变异方法”;错误

Iphone 获得;“发送到不可变对象的变异方法”;错误,iphone,objective-c,nsmutablearray,Iphone,Objective C,Nsmutablearray,我不知道是什么原因造成的。基本上,我的应用程序中有几个不同的“任务”相互冲突。当我按下按钮时,它会很好地运行以下代码: PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate]; [dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]]; 它可以做很多次,只要我喜欢。但当我

我不知道是什么原因造成的。基本上,我的应用程序中有几个不同的“任务”相互冲突。当我按下按钮时,它会很好地运行以下代码:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];




[dataCenter.colourPalettesContainer addObject:[NSNumber numberWithInt:5]];
它可以做很多次,只要我喜欢。但当我执行另一项任务时(有一些任务会导致这种情况发生),其中包括以下代码,例如:

PalAppDelegate *dataCenter = (PalAppDelegate *)[[UIApplication sharedApplication] delegate];

[dataCenter.colourPalettesContainer removeObjectAtIndex:touchDownID];

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:dataCenter.colourPalettesContainer forKey:@"container"];
[prefs synchronize];
然后:

dataCenter.colourPalettesContainer = [prefs objectForKey:@"container"];
当我在此之后再次运行第一个代码时,它会导致“mutating method sent to immutable object”错误导致崩溃。我怎样才能阻止这一切


编辑:所以我从下面的一些答案中找到了问题所在。是否有人有他们建议的不同方法来执行此操作?

NSUserDefaults
始终返回不可变的对象,即使您存储的对象是可变的。要解决这个问题,您需要创建一个可变副本。由于
-mutableCopy
返回调用者拥有的对象,因此需要(自动)释放该对象:


编辑)我不久前发布了一些,以回答另一个问题。如果您的问题涉及到更深层的集合嵌套,并且您需要它们都是可变的,这可能会有所帮助。

NSUserDefaults
始终返回不可变的对象,即使您存储的对象是可变的。要解决这个问题,您需要创建一个可变副本。由于
-mutableCopy
返回调用者拥有的对象,因此需要(自动)释放该对象:


编辑)我不久前发布了一些,以回答另一个问题。如果您的问题涉及到更深层的集合嵌套,并且您需要它们都是可变的,这可能会有所帮助。

NSUserDefaults返回一个不可变的数组。在加载备份时,您需要创建一个可变副本:

NSMutableArray *mutableArray = [[prefs objectForKey:@"container"] mutableCopy];
dataCenter.colourPalettesContainer = mutableArray;
[mutableArray release];

由于要在数组中存储NSMutableArray,您可能还必须在数组内部进行一些操作

NSUserDefaults返回一个不可变数组。在加载备份时,您需要创建一个可变副本:

NSMutableArray *mutableArray = [[prefs objectForKey:@"container"] mutableCopy];
dataCenter.colourPalettesContainer = mutableArray;
[mutableArray release];

由于要在数组中存储NSMutableArray,您可能还必须在数组内部进行一些操作

从数组的特定索引中删除对象。(Swift 3.0)


从数组的特定索引中删除对象。(Swift 3.0)


您的代码嵌套太深,人类无法轻松理解。我建议您将addObject语句分解为5或10个子语句。如果有什么东西坏了,你就有机会知道它在哪里。自从我在“首选项”行中添加“保存”后,它才坏了。它与我的深度嵌套数组无关。我将从中删除一些部分以使其更易于理解。您说“当我再次运行之后的第一个代码时,它崩溃了”-意思是嵌套数组中的某个地方,对吗?问题是你不知道问题在哪里。我从许多痛苦的经历中发现,像这样的高度复杂的语句不会为您节省任何编译或性能时间,也不会使代码更易于维护或调试,因此不值得花时间首先构建它们。我不是批评,只是提供一些友好的建议。坦率地说,答案没有多大意义。在安德鲁编辑他的问题之前,我的回答更有意义。他向NSUserDefaults添加了一组可变集合,然后试图对他获取的对象调用mutating方法。目前编写的问题并没有明确说明这一点,但最初的问题说明了这一点。您的代码嵌套太深,人类很难理解。我建议您将addObject语句分解为5或10个子语句。如果有什么东西坏了,你就有机会知道它在哪里。自从我在“首选项”行中添加“保存”后,它才坏了。它与我的深度嵌套数组无关。我将从中删除一些部分以使其更易于理解。您说“当我再次运行之后的第一个代码时,它崩溃了”-意思是嵌套数组中的某个地方,对吗?问题是你不知道问题在哪里。我从许多痛苦的经历中发现,像这样的高度复杂的语句不会为您节省任何编译或性能时间,也不会使代码更易于维护或调试,因此不值得花时间首先构建它们。我不是批评,只是提供一些友好的建议。坦率地说,答案没有多大意义。在安德鲁编辑他的问题之前,我的回答更有意义。他向NSUserDefaults添加了一组可变集合,然后试图对他获取的对象调用mutating方法。目前编写的问题并没有说明这一点,但最初的问题说明了这一点。我认为你是对的,因为实现该代码会在我的应用程序中导致一些非常奇怪的行为。你知道我需要在数组中做什么样的操作吗?我会把它调高,这样你就只需要保存不可变的对象,这样就更简单了。对于阵列,将其作为NSArray而不是NSMutableArray保存。然后,当需要更改内容时,将其拉出,制作可变副本,添加/删除项,然后将其添加回主数组。我也可能会将调色板容器作为字典而不是数组。这样,您就可以记录密钥的值。您还可以基于键进行替换,而不必担心索引。订单对这个案例来说并不重要。+1对你来说,因为它也节省了我的时间,我不知道为什么会出现这个问题,甚至我的数组是可变数组…………我认为你是对的,因为实现该代码会在我的应用程序中导致一些非常奇怪的行为。你知道我需要在数组中做什么样的操作吗?我会把它调高,这样你就只需要保存不可变的对象,这样就更简单了。对于阵列,将其作为NSArray而不是NSMutableArray保存。然后,当您需要更改内容时,将其拉出,制作一个可变的
let fullArray : NSArray = Userdefaults().value(forKey: "YOUR_ARRAY_STRING") as! NSArray
var mutableArray : [AnyObject] = fullArray as [AnyObject]
mutableArray.remove(at: INDEX_TO_REMOVE) //Eg: mutableArray.remove(at: 0)
mutableArray.append(ARRAY_TO_APPEND)