Xcode:@dynamic类变量不起作用

时间:2013-07-09 23:28:52

标签: objective-c nsmanagedobject

我有一个声明用户并包含这些变量的类:

(User.h文件):

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * unid;

(User.m文件):

@dynamic name;
@dynamic unid;

通过解析字符串,我有一个值数组。 然后我想相应地设置值:

(ViewController.m文件):

[user setName:[returned objectAtIndex:1]];
[user setUnid:[returned objectAtIndex:2]];

运行此命令时,编译器会出现以下错误:

unrecognized selector sent to instance
*** WebKit discarded an uncaught exception in the webView:shouldInsertText:replacingDOMRange:givenAction: delegate: <NSInvalidArgumentException> -[User setName:]: unrecognized selector sent to instance

当我注释掉setName行时,它可以正常工作。

然后我查看了返回数组中两个对象的类,它们都是:__NSCFString

然后我尝试了这段代码:

(ViewController.m文件):

[user setName:[returned objectAtIndex:2]];

同样的错误。

为什么同一输入在一种情况下失败,如果他们都期望相同的输入,则在另一种情况下成功?

感谢。

修改

此错误很奇怪,因为此部分应用不会与任何网络视图互动。这个返回的数组是从网页的字符串集合中解析的:

(ViewController.m文件):

NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://url_goes_here.com" encoding:NSUTF8StringEncoding error:&error];
NSArray *returned = [returned componentsSeparatedByString:@"#"];

然而,unid也是从这个数组中解析而没有任何问题。

1 个答案:

答案 0 :(得分:3)

@dynmaic关键字表示您将自己提供访问者。如果您希望编译器为您创建访问器,只需删除@dynamic name声明即可。 (由于@synthesize现在是默认设置,因此您无需明确使用它。)否则,您需要创建-name-setName:-unid,和-setUnid:方法本身。

  

它实际上是xcode使用NSManagedObject子类进行核心数据的设置类

这是一个重要的细节。对于托管对象,Core Data将为您提供访问器,您只需要@dynamic属性声明,让编译器知道它本身不应生成访问器。

我有点困惑为什么这个错误来自Web视图委托方法。如果您可以解释一下核心数据类如何与Web视图交互,可能会有所帮助。

  

为什么这适用于unid,而不是名称

您获得的错误是运行时错误 - 抛出异常。 name访问者很可能只是第一个使用的访问者;如果首先设置该属性,unid可能会发生同样的事情。

  

这个错误很奇怪,因为这部分应用不与任何网络视图互动。

另一个重要线索。在这一点上,听起来非常像你有一个糟糕的指针。您正在将-setName:发送到不是您认为的对象,在这种情况下,它会成为Web视图委托。尝试打开NSZombies来帮助您跟踪它。