1

我对 iOS 没有太多经验,但我正在处理一些遗留代码。在项目中,我们使用一个对象作为字典的键:

NSMutableDictionary * dict;
RoleContainer * role = [Class getRole];
[dict setObject:[Class getData] forKey:role];

我们将角色传递给另一个函数。当我们尝试检索数据时:

data = [dict objectForKey:role];

有时返回值为空。它发生在大约 10% 的时间。我单步执行了代码,在将角色传递给函数后发现“角色”对象的引用已更改!例如,从 0x002bf500 到 0x00222bad。

为什么?

4

3 回答 3

2

为了与NSMutableDictionary您的RoleContainer类很好地玩耍,必须实现一个hashisEqual方法。否则,相同的角色可能会在字典中记录两次,或者通过有效键查询可能会失败。

下面是一个简短的示例,说明如何在您的班级有一个识别成员时实现您的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
于 2012-07-10T20:10:06.100 回答
1

尝试

NSMutableDictionary * dict = [NSMutableDictionary dictionary];

看看你的Class. 它是一个类,而 getRole 是一个类方法吗?它是一个对象吗?

于 2012-07-10T19:26:43.127 回答
1

在该代码中, dict 将为零,因此您将向任何内容发送消息。它实际上是指向后来的东西吗?

我假设您的 RoleContainer 响应 stringValue 方法,如果它超载,这可能是查看发生了什么的好地方。

如果它使用标准字符串值,那么它会返回类和内存位置。如果有人正在将对象重置为键,这可能不可靠。

您可能还会遇到一个问题,即 getData 对象在不应该被触及的地方被释放。尝试在调试器中启用 NSZombieEnabled,或启用 ARC。

于 2012-07-10T19:50:15.723 回答