Ios 无法进行NSArray深度复制

Ios 无法进行NSArray深度复制,ios,objective-c,nsarray,parse-platform,deep-copy,Ios,Objective C,Nsarray,Parse Platform,Deep Copy,我的应用程序上的用户可以选择过滤器来缩小项目范围。选择过滤器后,将发送NSNotification,将选定过滤器的数组NSString传递给另一个视图控制器 当我收到通知时,我可以从[notification userInfo]提取数组。现在,我要做的是将新的过滤器与已经为用户保存的过滤器进行比较,这样,只有当它们不同时,我才能调用服务器。以下是我的方法: - (void)applyFilters:(NSNotification *)notification { NSArray *fi

我的应用程序上的用户可以选择过滤器来缩小项目范围。选择过滤器后,将发送NSNotification,将选定过滤器的数组NSString传递给另一个视图控制器

当我收到通知时,我可以从[notification userInfo]提取数组。现在,我要做的是将新的过滤器与已经为用户保存的过滤器进行比较,这样,只有当它们不同时,我才能调用服务器。以下是我的方法:

- (void)applyFilters:(NSNotification *)notification {

    NSArray *filters = [[notification userInfo] objectForKey:@"filters"];

    if (showMyItems) {

        if (![[NSSet setWithArray:filters] isEqualToSet:[NSSet setWithArray:[[PFUser currentUser] objectForKey:@"filtersMy"]]]) {

            [[PFUser currentUser] setObject:[NSArray arrayWithArray:filters] forKey:@"filtersMy"];
            [[PFUser currentUser] saveInBackground];
        }

    } else {

        if (![[NSSet setWithArray:filters] isEqualToSet:[NSSet setWithArray:[[PFUser currentUser] objectForKey:@"filters"]]]) {

            [[PFUser currentUser] setObject:[NSArray arrayWithArray:filters] forKey:@"filters"];
            [[PFUser currentUser] saveInBackground];
        }
    }
}
这里我比较的是NSSET而不是NSArrays,因为对象/字符串的顺序并不重要。然后我尝试创建一个新数组,并通过arrayWithArray将其设置为用户的新过滤器:。因此,当用户下次更改过滤器选择时,我希望新的过滤器数组将不同于为用户保存的为我的if语句条件的过滤器数组。但是,当我记录新阵列和保存/获取的阵列时,它们完全相同!因此,if条件永远不会通过

对此,我唯一的解释是[NSArray arrayWithArray:filters]在某种程度上仍然指向filters数组

我甚至尝试了苹果公司建议的[NSKeyedUnarchiveObjectwithData:[NSKeyedArchiver ArchiveDatawithRootObject:filters]],但结果是一样的

有人能指出我的问题吗?我没有选择和想法了

更新:

我现在已经粘贴了上面的完整方法。更多的背景:

我正在使用同一UIViewController类的两个实例 在一个实例中,showMyItems设置为YES,因此只调用if语句的顶部。在另一个实例中-否,因此只调用较低的部分 有趣的是,当showMyItems为否时,我的代码按预期工作!但当showMyItems为“是”时,它不会。。。虽然代码是相同的。 有什么想法吗

NSArray *temp = [[NSMutableArray alloc] initWithArray:filters copyItems:YES]; 
以上内容适用于一级深度复制

对于深度复制,到目前为止我发现最好的方法是

NSMutableArray *deepCopyArray = (NSMutableArray*)CFBridgingRelease(CFPropertyListCreateDeepCopy(kCFAllocatorDefault, (CFDictionaryRef)filters, kCFPropertyListMutableContainers));

我已经测试了一些代码,不知道为什么If语句没有触发。下面是示例代码:

NSArray *newFilters = @[@"A",@"B",@"D"];
NSArray *oldFilters = [[NSUserDefaults standardUserDefaults] objectForKey:@"filters"];

if (![[NSSet setWithArray:newFilters] isEqualToSet:[NSSet setWithArray:oldFilters]]) {
    [[NSUserDefaults standardUserDefaults] setObject:newFilters forKey:@"filters"];
    [[NSUserDefaults standardUserDefaults] synchronize];
} else {
    NSLog(@"Not Equal");
}

此代码将对过滤器的更改做出相应的反应。我不太清楚为什么要在这里创建一个新数组[[PFUser currentUser]setObject:[NSArray arrayWithArray:filters]forKey:@filters]

将我以前的方法改写成这个解决了我的问题,尽管我真的不完全明白为什么

- (void)applyFilters:(NSNotification *)notification {

    NSArray *filters = [[notification userInfo] objectForKey:@"filters"];

    NSString *key = (myItems) ? @"filtersMy" : @"filters";

    if (![[NSSet setWithArray:filters] isEqualToSet:[NSSet setWithArray:[[PFUser currentUser] objectForKey:key]]]) {

        [[PFUser currentUser] setObject:[NSArray arrayWithArray:filters] forKey:key];
        [[PFUser currentUser] saveInBackground];

        [self setUpItemsArrayWithFilters:filters];
    }
}

我基本上只使用了一次相同的代码,只使用了不同的键,这取决于当前激活的控制器。

代码太少,无法看到问题所在。你能在一个示例项目中找出这个问题吗?我已经用完整的方法和一些背景细节更新了这个问题。不管我是设置Object:filters、[NSArray arrayWithArray:filters]还是[[NSMutableArray alloc]initWithArray:filters copyItems:YES],我都会得到相同的行为,如果条件不通过的话。老实说,我不知道为什么会这样……我认为问题不在于复制。你可能在其他地方犯了一个错误,如果你能发布更多相关的代码,那就太好了。以上每次都对我有用。您的代码中有一些错误没有在上面的问题中列出。