0

我有一个声明 User 并包含以下变量的类:

(用户.h 文件):

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

(用户.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]];

再次出现同样的错误。

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

谢谢。

编辑:

这个错误很奇怪,因为应用程序的这一部分不与任何 webviews 交互。这个返回的数组是从网页收集的字符串中解析出来的:

(ViewController.m 文件):

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

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

4

1 回答 1

3

@dynmaic关键字意味着您将自己提供访问器。如果您希望编译器为您创建访问器,只需删除@dynamic name声明即可。(因为@synthesize现在是默认设置,您不必显式使用它。)否则,您需要自己创建-name-setName:-unid-setUnid:方法。

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

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

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

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

你得到的错误是一个运行时错误——一个异常被抛出。访问器很可能name只是第一个使用的访问器。unid如果首先设置该属性,则可能会发生同样的事情。

这个错误很奇怪,因为应用程序的这一部分不与任何 webviews 交互。

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

于 2013-07-09T23:30:56.713 回答