2012-07-10 99 views
1

我对iOS没有太多的经验,但我正在研究一些遗留代码。在该项目中,我们使用一个对象作为字典的关键字:iOS是否更改对象的引用?

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

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

data = [dict objectForKey:role]; 

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

为什么?

+0

什么是'Class'?强烈建议您不要使用'Class'作为您自己的类或实例的名称。但我怀疑你的问题是你没有使用ARC,而你没有保留一些对象。 – 2012-07-10 19:37:03

+0

类只是一个假名,所以它没关系。但我认为你正在进行一些工作,因为我不知道保留是什么......让我做一些研究。谢谢, – 2012-07-10 19:48:38

+1

在理解存储模型之前,您至少在基本级别上都无法用Objective-C做任何事情。 – 2012-07-10 19:51:03

回答

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 
1

尝试NSMutableDictionary * dict = [NSMutableDictionary dictionary];

而且这将是有意义的看看你的Class。它是一个类,getRole是一个类方法吗?它是一个对象吗?

1

在该代码中,dict将为零,因此您将消息发送至无。它实际上是指向以后的事吗?

我假设你的RoleContainer对stringValue方法做出了响应,这可能是一个很好的地方,看看它是否过载会发生什么。

如果它使用标准字符串值,那么它将返回类和内存位置。如果某人下线将对象重置为密钥,这可能不可靠。

您可能还有一个问题,getData对象被释放到某处不应触及的地方。在调试器中尝试enablingNSZombieEnabled,或启用ARC。

相关问题