Objective c NSMutableSet respondsToSelector addObject:返回false

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 = [[

NSMutableSet的respondsToSelector有问题

我有一个这样的程序:

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。可以在未分配的对象中调用方法吗?