Objective c NSMutableSet respondsToSelector addObject:返回false
NSMutableSet的respondsToSelector有问题 我有一个这样的程序:Objective c NSMutableSet respondsToSelector addObject:返回false,objective-c,nsmutableset,respondstoselector,Objective C,Nsmutableset,Respondstoselector,NSMutableSet的respondsToSelector有问题 我有一个这样的程序: NSArray *arguments = [[NSProcessInfo processInfo] arguments]; theClass = [arguments objectAtIndex: 1]; theMethod = [arguments objectAtIndex: 2]; theArgument = [arguments objectAtIndex: 3]; id object = [[
NSArray *arguments = [[NSProcessInfo processInfo] arguments];
theClass = [arguments objectAtIndex: 1];
theMethod = [arguments objectAtIndex: 2];
theArgument = [arguments objectAtIndex: 3];
id object = [[NSClassFromString(theClass) init] autorelease];
if([object respondsToSelector:NSSelectorFromString(theMethod)]) {
NSLog(@"Result: %@",
[object performSelector:NSSelectorFromString(theMethod) withObject: theArgument]);
} else {
NSLog(@"Class %@ doesn't respond to %@.",
theClass, theMethod);
}
我使用/program NSMutableSet addObject:str调用它,但是程序总是说NSMutableSet不响应addObject:
我不知道为什么respondsToSelector总是说NSMutableSet不响应addObject。这与/program NSMutableSet allObjects相同,您检查的内容完全不同
[NSClassFromString(theClass) init]
需要
[[NSClassFromString(theClass) alloc] init]
相反。
[NSClassFromString(类)init]
应该是[[NSClassFromString(类)alloc]init]
…谢谢,你说得对。现在它可以工作了。你知道为什么需要这样做(即,这是一个输入错误)吗?或者你认为[NSClassFromString(theClass)init]
很好吗?我认为问题是,如果没有alloc,它就不能为实例分配内存。我正在学习Objective-C,我把它和自动释放混淆了。@LucasKreutz:“我认为问题是,没有alloc,它就不能为实例分配内存。”它比这更复杂NSClassFromString(类)
返回一个类对象。对类对象调用init
做什么?类对象响应其根类的所有实例方法(在本例中为NSObject
)<代码>-[NSObject init]基本上不执行任何操作并返回调用它的对象。所以实际发生的是,object
指向NSMutableSet
的类对象,而不是它的一个实例。我理解这个错误,但是,为什么编译器没有警告我?@LucasKreutz因为NSClassFromString
返回class
,这是通用的Objective-C类类型,编译器无法知道它响应哪些消息。哦,这是有道理的。谢谢。@LucasKreutz:“为什么编译器没有警告我?”警告你哪部分?在对象上调用添加对象:
?1) 由于object
的类型是id
,编译器将永远不会在您发送给它的消息上警告您,并且2)您正在使用performSelector:
动态调用它,因此无法在编译时检查它。@newacct警告我使用了init而没有alloc。可以在未分配的对象中调用方法吗?