Tag: 可变

试图改变不可变的对象错误

我的代码崩溃在这一行: [(NSMutableString *)string replaceCharactersInRange:range withString:@""]; 用错误尝试来改变不可变的对象。 这是怎么发生的,我该如何解决?

集合中的可变对象

从文档中 ,将可变对象存储在集合对象中可能会导致问题。 某些集合可能会变得无效甚至损坏,如果它们包含mutate的对象,因为通过变异,这些对象可能会影响它们被放置在集合中的方式。 首先,如果更改的属性影响对象的散列或isEqual:方法的结果,则散列集合(如NSDictionary对象或NSSet对象)中的键的对象的属性(如果更改)将会损坏集合。 (如果集合中的对象的散列方法不依赖于它们的内部状态,那么腐败就不太可能)。其次,如果有序集合(如sorting数组)中的对象的属性发生更改,则可能会影响对象与数组中的其他对象进行比较,从而导致sorting无效。 但是当我logging结果时,对象被完美地添加到集合中。 其实这样做是不安全的? -(void)mutableObjectsinCollections{ NSMutableArray *arr1 = [[NSMutableArray alloc]init]; NSMutableArray *arr2 = [[NSMutableArray alloc]init]; NSMutableArray *arr3 = [[NSMutableArray alloc]init]; NSMutableArray *arr4 = [[NSMutableArray alloc]init]; [self addObjectsToArrayBefore:arr1]; [self addObjectsToArrayBefore:arr2]; [self addObjectsToArrayBefore:arr3]; [self addObjectsToArrayBefore:arr4]; NSDictionary *dict = @{@"arr1": arr1,@"arr2": arr2,@"arr3": arr3,@"arr4": arr4,@"arr5": arr5}; NSLog(@"%@",dict); [self addObjectsToArrayAfter:arr1]; [self addObjectsToArrayAfter:arr2]; [self addObjectsToArrayAfter:arr3]; [self addObjectsToArrayAfter:arr4]; NSLog(@"%@",dict); […]

在closures类和结构的Swift可变结构行为有所不同

我有一个类(A)有一个结构variables(S)。 在这个类的一个函数中,我调用了structvariables的变异函数,这个函数需要一个闭包。 这个闭包的主体检查结构variables的名称属性。 Struct的变异函数依次调用某个类(B)的函数。 这个类的函数再次closures。 在这个闭包的主体中改变结构,即改变name属性,并调用第一个类提供的闭包。 当第一个类(A)闭包被调用时,我们正在检查结构的名称属性,它永远不会改变。 但是在步骤2中,如果我使用结构(C)而不是类B,则会发现类A的闭包结构实际上已更改。 以下是代码: class NetworkingClass { func fetchDataOverNetwork(completion:()->()) { // Fetch Data from netwrok and finally call the closure completion() } } struct NetworkingStruct { func fetchDataOverNetwork(completion:()->()) { // Fetch Data from netwrok and finally call the closure completion() } } struct ViewModelStruct { /// Initial value var data: […]

NSMutableDictionary:将变异方法发送给不可变对象

下面的代码返回一个exception,当试图removeObjectForKey时,出现以下错误消息“mutating method sent to immutable object” NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"]; NSString *key = self.currentDeviceNameText.text; NSString *ipAddressTemp = [storedIpDictionary objectForKey:key]; [storedIpDictionary removeObjectForKey:key]; <—-Crashes here storedIpDictionary[key] = ipAddressTemp; 不知道是什么问题,也许是由于从NSUserDefaults检索字典。 但是下面的代码没有任何问题。 NSMutableDictionary * storedIpDictionary = (NSMutableDictionary*)[[NSUserDefaults standardUserDefaults] dictionaryForKey:@"dictDeviceIp"]; [storedIpDictionary removeAllObjects];

Swift中的不可变/可变集合

我指的是Apple Swift编程指南,用于理解Swift语言中可变/不可变对象(数组,字典,集合,数据)的创build。 但是我不明白如何在Swift中创build一个不可变集合。 我想在Objective-C中的Swift中看到下面的等价物 不可变arrays NSArray *imArray = [[NSArray alloc]initWithObjects:@"First",@"Second",@"Third",nil]; 可变数组 NSMutableArray *mArray = [[NSMutableArray alloc]initWithObjects:@"First",@"Second",@"Third",nil]; [mArray addObject:@"Fourth"]; 不可变的词典 NSDictionary *imDictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil]; 可变的字典 NSMutableDictionary *mDictionary = [[NSMutableDictionary alloc]initWithObjectsAndKeys:@"Value1", @"Key1", @"Value2", @"Key2", nil]; [mDictionary setObject:@"Value3" forKey:@"Key3"];