我对iOS没有太多经验,但是我正在研究一些旧代码。在项目中,我们使用一个对象作为字典的键:
NSMutableDictionary * dict;
RoleContainer * role = [Class getRole];
[dict setObject:[Class getData] forKey:role];
我们已将角色传递给另一个函数。当我们尝试检索数据时:
data = [dict objectForKey:role];
有时,返回值为空。大约发生10%的时间。我单步执行代码,将角色传递给函数后,发现“角色”对象的引用已更改!例如,从0x002bf500到0x00222bad。
为什么?
最佳答案
为了与NSMutableDictionary
完美搭配,您的RoleContainer
类必须实现hash
和isEqual
方法。否则,相等的角色可能会在字典中记录两次,或者通过有效键进行查询可能会失败。
这是一个简短的示例,说明当您的类具有标识成员时如何实现hash
/ isEqual
:
@interface RoleContainer : NSObject
@property (nonatomic, readonly) NSString *name;
- (NSUInteger)hash;
- (BOOL)isEqual:(id)anObject;
@end
@implementation RoleContainer
@synthesize name = _name;
- (NSUInteger)hash {
return [name hash];
}
- (BOOL)isEqual:(id)anObject {
if (![anObject isKindOfClass:[RoleContainer class]]) {
return NO;
}
RoleContainer *other = (RoleContainer*)anObject;
return [_name isEqual:[other name]];
}
@end
关于objective-c - iOS是否会更改对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420414/