Objective c iOS是否更改对象的引用?

Objective c iOS是否更改对象的引用?,objective-c,ios,reference,Objective C,Ios,Reference,我对iOS没有太多的经验,但我正在编写一些遗留代码。在项目中,我们使用对象作为字典的键: NSMutableDictionary * dict; RoleContainer * role = [Class getRole]; [dict setObject:[Class getData] forKey:role]; 我们已将角色传递给另一个函数。当我们尝试检索数据时: data = [dict objectForKey:role]; 有时返回值为空。大约有10%的时间是这样的。我仔细阅读了代

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

NSMutableDictionary * dict;
RoleContainer * role = [Class getRole];
[dict setObject:[Class getData] forKey:role];
我们已将角色传递给另一个函数。当我们尝试检索数据时:

data = [dict objectForKey:role];
有时返回值为空。大约有10%的时间是这样的。我仔细阅读了代码,发现在将role传递给函数后,“role”对象的引用已更改!例如,从0x002bf500到0x0022B

为什么?

试试看

NSMutableDictionary * dict = [NSMutableDictionary dictionary];
另外,查看一下您的
类也很有意义。它是一个类,getRole是一个类方法吗?它是物体吗

试试看

NSMutableDictionary * dict = [NSMutableDictionary dictionary];

另外,查看一下您的
类也很有意义。它是一个类,getRole是一个类方法吗?它是物体吗

在该代码中,dict将为零,因此您将消息发送为零。它是不是后来真的指向了什么

我假设您的RoleContainer响应stringValue方法,这可能是一个查看重载情况的好地方

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


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

在该代码中,dict将为nil,因此您将不发送任何消息。它是不是后来真的指向了什么

我假设您的RoleContainer响应stringValue方法,这可能是一个查看重载情况的好地方

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


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

为了更好地使用
NSMutableDictionary
您的
RoleContainer
类必须实现
hash
isEqual
方法。否则,在字典中可能会记录两次相同的角色,或者使用有效键进行查询可能会失败

下面是一个简单的示例,说明在类具有标识成员时如何实现
哈希
/
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

为了更好地使用
NSMutableDictionary
您的
RoleContainer
类必须实现
hash
isEqual
方法。否则,在字典中可能会记录两次相同的角色,或者使用有效键进行查询可能会失败

下面是一个简单的示例,说明在类具有标识成员时如何实现
哈希
/
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

什么是
?强烈建议您不要使用
Class
作为自己的类或实例的名称。但我怀疑你们的问题在于你们并没有使用ARC,你们并没有保留一些对象。类只是一个假名字,所以这无关紧要。但我想你已经了解了一些事情,因为我不知道什么是保留……让我做一些研究。谢谢,在您了解存储模型之前,您不可能对Objective-C做任何事情,至少在基本层面上是这样。@XiZhang我假设您已经在实际代码中初始化了
dict
变量,对吗?什么是
?强烈建议您不要使用
Class
作为自己的类或实例的名称。但我怀疑你们的问题在于你们并没有使用ARC,你们并没有保留一些对象。类只是一个假名字,所以这无关紧要。但我想你已经了解了一些事情,因为我不知道什么是保留……让我做一些研究。谢谢,在您了解存储模型之前,您不可能对Objective-C做任何事情,至少在基本层面上是这样。@XiZhang我假设您已经在实际代码中初始化了
dict
变量,对吗?