我是Objective-C的新手,我遇到了NSMutableDictionary。我想在键中插入一个对象,根据我的理解,你需要使用NSCopying类进行复制。
我一直在阅读Apple的文档,我仍然对此感到困惑。此外,我一直在搜索示例,我似乎只能找到具有密钥的NSString对象,这些对象似乎是自动复制的。
以下是我的实施代码的一部分:
@implementation League
- (void) setPlayerInTeam: (Club*) theClub playerObject: (Person*) person{
[playerTeam setObject:theClub forKey: person];
}
@end
forKey:人显然是错的,如何使用NSCopying复制这个?对不起是一个新手但我渴望学习。
非常感谢。
答案 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]
方法以避免其他类型的缺陷。
有时这是必须的,但在可能的情况下避免使用它。