NSMutableDictionary和NSCopying,想要在键中添加一个对象

时间:2014-01-01 14:17:58

标签: objective-c

我是Objective-C的新手,我遇到了NSMutableDictionary。我想在键中插入一个对象,根据我的理解,你需要使用NSCopying类进行复制。

我一直在阅读Apple的文档,我仍然对此感到困惑。此外,我一直在搜索示例,我似乎只能找到具有密钥的NSString对象,这些对象似乎是自动复制的。

以下是我的实施代码的一部分:

@implementation League
- (void) setPlayerInTeam: (Club*) theClub playerObject: (Person*) person{
    [playerTeam setObject:theClub forKey: person];
}
@end
forKey:人显然是错的,如何使用NSCopying复制这个?对不起是一个新手但我渴望学习。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您在NSMutableDictionary中使用的密钥具有某些限制。 NSMutableDictionary在您使用-setObject:forKey:时复制密钥。这意味着密钥必须支持NSCopying协议。所以Person需要像这样声明:

@interface Person : PersonsSuperClass <NSCopying>

并且它需要实现方法-copyWithZone:如果Person类是不可变的并且您正在使用ARC,-copyWithZone:只能返回self

-(id) copyWithZone: (NSZone*) zone
{
    return self;  // or return [self retain] if not using ARC.
}

如果Person不是不可变的,-copyWithZone:需要创建一个与您正在复制的对象完全相同的新Person对象。

-(id) copyWithZone: (NSZone*) zone
{
    Person* theCopy = [[[self class] allocWithZone: zone] init];
    // copy all the data from self to theCopy
    return theCopy;
}

还有一些其他事情你需要小心。方法-isEqual:必须在语义上正确,因为这是NSMutableDictionary进行比较的方式。例如,如果Person由名为userId的属性唯一索引,则需要使-isEqual:使用该属性来确定两个Person对象是否相等。 -hash存在类似的规则,两个使用-isEqual:进行比较的对象必须具有相同的哈希值。

答案 1 :(得分:0)

作为Hot Licks said,您必须创建-[Person copyWithZone:]方法。

@interface Person : NSObject <NSCopying>
@property NSString *firstName;
@property NSString *lastName;
…
@end

@implementation
- (id)copyWithZone:(NSZone *)zone
{
    Person *copy = [[[self class] allocWithZone:zone] init];
    if (copy) {
        copy->_firstName = [self.firstName copyWithZone:zone];
        copy->_lastName = [self.lastName copyWithZone:zone];
        …
    }
    return copy;
}
@end

这是real pain并且充满了可能的微妙缺陷。此外,我强烈建议您创建-[Person isEqual:]-[Person hash]方法以避免其他类型的缺陷。

有时这是必须的,但在可能的情况下避免使用它。