objective-c - iOS是否会更改对象的引用?

标签 objective-c ios reference

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

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

我们已将角色传递给另一个函数。当我们尝试检索数据时:
data = [dict objectForKey:role];

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

为什么?

最佳答案

为了与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

关于objective-c - iOS是否会更改对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420414/

相关文章:

ios - 如何从我的应用程序中打开亚马逊应用程序?

c# - VS2012 + CRM 2011 : Microsoft. IdentityModel 引用错误

java - Java从文件加载对象时的变量引用问题

ios - 在 UITableView 中返回 YouTube channel 的视频列表

ios - Swift - 在 PageViewController 场景中隐藏标签栏

ios - ModalViewController 隐藏在 View 下

c++ - 基类引用 - 为其分配其他类型

objective-c - iOS - 获取标题结果

Ios- Ipad- UicollectionViewCell- 单元格上的图标- 如何在 xcode 5 中向图标添加点击手势?

objective-c - 无法将 NSNamedColorSpace 转换为 NSDeviceRGBColorSpace?