【问题标题】:Question about deep copying example关于深度复制示例的问题
【发布时间】:2011-05-29 18:21:14
【问题描述】:

在《iPhone 4 入门》一书中,作者有此代码来创建一个类别,用于创建一个 NSDictionary 的深层副本,其中包含字母表中每个字母的名称的 NSArray,以显示带有搜索的索引表的示例吧。

#import "NSDictionary-MutableDeepCopy.h"
@implementation NSDictionary (MutableDeepCopy)
- (NSMutableDictionary *) mutableDeepCopy { 
    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc] initWithCapacity:[self count]]; 
    NSArray *keys = [self allKeys]; 
    for (id key in keys) {
        id oneValue = [self valueForKey:key]; 
        id oneCopy = nil;
        if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) oneCopy = [oneValue mutableDeepCopy];
        else if ([oneValue respondsToSelector:@selector(mutableCopy)]) oneCopy = [oneValue mutableCopy];
        if (oneCopy == nil) 
           oneCopy = [oneValue copy];
        [returnDict setValue:oneCopy forKey:key]; 
        [oneCopy release];
    } 
    return returnDict;
} 

@end

有人能解释一下 for 循环的逻辑吗?我不确定他在查看哪个值响应哪个选择器以及为什么将其添加到字典中要做什么。谢谢。

【问题讨论】:

    标签: iphone objective-c categories nscoding


    【解决方案1】:

    因此,for 循环只是遍历字典中的所有键。事先,我们创建了一个名为 returnDict 的新字典 - 这将是我们返回的内容。

    对于我们要复制的字典中的每个键,我们...

    1. 获取为该键存储的对象 ([self valueForKey:key]),并将其保存到名为 oneValue 的变量中。

    2. 如果oneValue 实现了我们的mutableDeepCopy 方法(即,它是一个NSDictionary),请调用它,并将返回值分配给一个名为oneCopy 的变量。

    3. 否则,我们看看oneCopy 是否实现了mutableCopy 方法。如果是,我们将输出放入oneCopy 变量中。

    4. 此时,我们检查是否按照步骤 (2) 和 (3) 为 oneCopy 变量分配了任何内容 (if (oneCopy == nil))。如果不是(即等于nil),我们可以假设该对象没有实现mutableDeepCopymutableCopy,因此我们改为调用普通的旧copy 并将其值分配给@987654337 @。

    5. 使用原始键将oneCopy 添加到我们的returnDict 字典中。

    这就是 for 循环 - 最后,我们返回复制的字典。

    【讨论】:

      【解决方案2】:

      for 循环中的逻辑令人费解,因为作者试图尽可能多地获取整个数组的可变副本和深度副本。代码尝试了三种不同的方式来满足这一点,按优先顺序排列:

      • 尽可能使用mutableDeepCopy(如果对象理解该消息)。
      • 否则,请尽可能使用mutableCopy
      • 如果一切都失败了,请使用copy

      如果对象只是简单的不可复制,那么您的代码在发送对象-copy 时会变得繁荣,因为没有测试对象是否响应-copy。这是合适的,因为尝试深度复制包含无法复制的项目的数组肯定是程序员错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-11
        • 1970-01-01
        • 2013-04-12
        • 2016-01-17
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 2016-04-30
        相关资源
        最近更新 更多