尝试访问 PFUser 子类的动态属性时出错

Posted

技术标签:

【中文标题】尝试访问 PFUser 子类的动态属性时出错【英文标题】:Error when trying to access a dynamic property of a PFUser subclass 【发布时间】:2014-12-26 20:25:29 【问题描述】:

我正在使用Parse.com,并且我有一个名为NPUserPFUser 子类。

代码如下:

NPUser.h

#import <Foundation/Foundation.h>
#import <Parse/Parse.h>

@interface NPUser : PFUser <PFSubclassing>

@property (nonatomic) NSString *facebookId;

- (NSURL *)profileImageURL;

@end

NPUser.m

#import "NPUser.h"
#import <Parse/PFObject+Subclass.h>

@implementation NPUser

@dynamic facebookId;

+ (void)load 
    [self registerSubclass];


- (NSURL *)profileImageURL 
    // -- This is where things blow up -- 
    NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", self.facebookId];
    return [NSURL URLWithString:urlString];


@end

当我致电profileImageURL 时,发生了一些奇怪的事情,似乎执行只是中止了,但应用程序并没有冻结。我在第一行设置了一个断点并将其缩小到 self.facebookId 失败。

当我打电话给self.facebookIdself[@"facebookId"][self objectForKey:@"facebookId"](我相信它们都是一样的)时,我得到了这个错误:

error: Execution was interrupted, reason: internal ObjC exception breakpoint(-3)..
The process has been returned to the state before expression evaluation.

我已经阅读了this question on Parse about subclassing PFUser,但我没有找到任何可以帮助我的东西。我还阅读了docs on subclassing PFObject 并遵循了那里所说的内容。

问题是所有功能都可以正常工作(我的NPUser 类似乎被正确调用并且它的所有属性都被正确设置)。当我检查 Parse.com 上的数据仪表板时,facebookId 属性也被正确保存。

我应该提到,当我检查被调用的用户对象时,它说它是 PFUser 而不是 NPUser,但 profileImageURL 方法(仅在 NPUser 中定义)确实被调用了。

我对此感到困惑。有什么想法或建议吗?

【问题讨论】:

【参考方案1】:

所以我睡在上面发现了问题,这是我的一个愚蠢的疏忽。

基本上在这种情况下,我没有直接访问用户对象。相反,它是指向我拥有的另一个对象的指针关联。所以问题是我没有打电话:

[query includeKey:@"user"];

在查询其他对象时,它实际上并未包含完整对象。这是偷偷摸摸的,因为那里有一个实际的对象,它的方法被调用,但它的动态属性没有实现(据我所知)。

希望这对将来的其他人有所帮助。

【讨论】:

绝对帮助了我。就我而言,经过几天的开发/测试,它突然停止工作。我必须从对象数组query.includeKey("listOfThings.object") 中包含一个键。使用 Parse SDK 时,我遇到过各种疯狂/可怕的事情。

以上是关于尝试访问 PFUser 子类的动态属性时出错的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB:当我尝试访问对象的属性时出错

Nuxt.js Typescript - 尝试访问计算属性中的数据对象时出错

从库中访问属性时出错

尝试访问 Thymeleaf 表单中的验证错误时出错

尝试初始化嵌套数组时出错“赋值表达式的左侧可能不是可选的属性访问。”

Hibernate:通过持久属性的反射访问字段 [private java.lang.Integer] 时出错