我有一个声明用户并包含这些变量的类:
(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也是从这个数组中解析而没有任何问题。
答案 0 :(得分:3)
@dynmaic
关键字表示您将自己提供访问者。如果您希望编译器为您创建访问器,只需删除@dynamic name
声明即可。 (由于@synthesize
现在是默认设置,因此您无需明确使用它。)否则,您需要创建-name
,-setName:
,-unid
,和-setUnid:
方法本身。
它实际上是xcode使用NSManagedObject子类进行核心数据的设置类
这是一个重要的细节。对于托管对象,Core Data将为您提供访问器,您只需要@dynamic
属性声明,让编译器知道它本身不应生成访问器。
我有点困惑为什么这个错误来自Web视图委托方法。如果您可以解释一下核心数据类如何与Web视图交互,可能会有所帮助。
为什么这适用于unid,而不是名称
您获得的错误是运行时错误 - 抛出异常。 name
访问者很可能只是第一个使用的访问者;如果首先设置该属性,unid
可能会发生同样的事情。
这个错误很奇怪,因为这部分应用不与任何网络视图互动。
另一个重要线索。在这一点上,听起来非常像你有一个糟糕的指针。您正在将-setName:
发送到不是您认为的对象,在这种情况下,它会成为Web视图委托。尝试打开NSZombies来帮助您跟踪它。