Ios 为什么Realm addOrUpdateObject会导致属性设置为nil?

Ios 为什么Realm addOrUpdateObject会导致属性设置为nil?,ios,objective-c,swift,realm,Ios,Objective C,Swift,Realm,我有一个托管的化身类和一个托管的用户类。用户类引用了化身类: @interface User : RLMObject ... @property (nonatomic, retain) Avatar *avatar; ... Avatar类看起来像: @interface Avatar : RLMObject @property (nonatomic, retain) NSString *urlStr; @property (nonatomic, retain) NSData *imageDa

我有一个托管的
化身
类和一个托管的
用户
类。
用户
类引用了
化身
类:

@interface User : RLMObject
...
@property (nonatomic, retain) Avatar *avatar;
...
Avatar
类看起来像:

@interface Avatar : RLMObject
@property (nonatomic, retain) NSString *urlStr;
@property (nonatomic, retain) NSData *imageData;
@end

@implementation Avatar
+ (NSString *)primaryKey {
    return @"urlStr";
}
+ (NSArray *)requiredProperties {
    return @[@"urlStr", @"imageData"];
}
@end
有些情况下,我已经获取了一个新用户(比如说,从服务器),但为了避免重新下载化身,我想从数据库中获取现有的一个。看起来很简单,但是在从db获取现有的
化身
引用(使用
[Avatar objectWithPrimaryKey]
)并将其设置为
用户
上的化身属性后,当我在域上调用
添加或更新对象
时,
化身
属性被设置为零。没有抛出异常或调试日志,属性只是从非nil变为nil。当然,数据库中的
User
引用是空的,尽管
Avatar
表仍然被填充

部分代码:

正在检查现有的头像:

    if let avatarURLStr = user.avatarURLStr, let avatarURL = URL(string: avatarURLStr) {
        if let dbAvatar = Avatar(forPrimaryKey: avatarURLStr) {
            let newAvatar = Avatar(urlStr: dbAvatar.urlStr, imageData: dbAvatar.imageData)
            user.avatar = newAvatar
        } else {
            if let data = NSData(contentsOf: avatarURL) {
                let avatar = Avatar(urlStr: avatarURLStr, imageData: data as Data!)
                user.avatar = avatar
            }
        }
    }
将用户添加到数据库:

            let realm = RLMRealm.default()
            realm.beginWriteTransaction()
            // user.avatar is non-nil here
            realm.addOrUpdate(user)
            // user.avatar is nil here
            try? realm.commitWriteTransaction()

我正在使用Objective-C的领域2.1.1(但该项目同时使用Swift和Obj-C)。

Oy…找到了答案。我把问题简化了一点,结果发现我正在更新的一个对象与另一个对象有关系,而另一个对象与另一个具有化身的对象有关系。而该化身为零。

我还想知道添加或更新引用托管对象的非托管对象是否可以。实际上,我已经尝试过制作一个新的没有管理的化身对象,并添加了它,但我得到了完全相同的问题。