Objective-C查找所有init(构造函数方法)

Objective-C查找所有init(构造函数方法),objective-c,constructor,runtime,selector,init,Objective C,Constructor,Runtime,Selector,Init,使用“”函数可以获得objective-C类上存在的所有方法的列表 在编写IOC容器时,我想知道如何找到这些方法中的哪些是构造函数。我想确定构造函数及其参数类型。您可以使用以下方法获得方法签名: methodSignatureForSelector: 从文件中: NSMethodSignature对象记录方法的参数和返回值的类型信息。它用于转发接收对象不响应的消息,尤其是在分布式对象的情况下。通常,您可以使用NSObject的methodSignatureForSelector:instance

使用“”函数可以获得objective-C类上存在的所有方法的列表


在编写IOC容器时,我想知道如何找到这些方法中的哪些是构造函数。我想确定构造函数及其参数类型。

您可以使用以下方法获得方法签名:

methodSignatureForSelector:

从文件中:

NSMethodSignature对象记录方法的参数和返回值的类型信息。它用于转发接收对象不响应的消息,尤其是在分布式对象的情况下。通常,您可以使用NSObject的methodSignatureForSelector:instance方法创建NSMethodSignature对象(在Mac OS X v10.5及更高版本上,您也可以使用SignatureWithobjType:)。然后使用它创建一个NSInvocation对象,该对象作为参数传递给forwardInvocation:message,以将调用发送到任何其他可以处理该消息的对象。在默认情况下,NSObject调用DoesNotReconficateSelector:,这会引发异常。对于分布式对象,NSInvocation对象使用NSMethodSignature对象中的信息进行编码,并发送到消息接收方表示的真实对象

我想知道如何找到这些方法中的哪些是 构造函数,因为我正在编写IOC容器。我想 确定构造函数及其参数类型

简言之,你不能。或者,至少,你会发现,沿着这条路走的是疯狂

首先,Objective-C没有构造函数。它有初始值设定项,有时很多,对于一个正确编写的类,只有一个是指定的初始值设定项。无法在编译时或运行时识别指定的初始值设定项


我如何在方法*中使用它,而不使用 上课

你没有。首先分配类的实例,然后初始化实例

总的来说,在学术调查之外,Objective-C并没有完成这种抽象层次。这是可以做到的,但通常是可以避免的,因为最终解决方案的脆弱性以及试图动态支持底层C ABI的代码地狱(去查看libffi的源代码)

如果您想沿着这条路走下去,那么最好是定义一个定制的抽象类,您的所有容器都将子类化,从而为它后面的类提供绑定逻辑

或使用协议;i、 一个类可以实现一个IOCBean协议,其中一个方法是
initIOCGoop
,即指定的初始值设定项goo


对所有类进行这种通用操作将充满脆弱性和特殊情况,并且需要大量代码,随着时间的推移,这些代码将难以维护。

但这是否告诉他其中哪些是初始值设定项(或者,他称之为“构造函数”)?AFAICT,初始值设定项是普通的Obj-C方法。@Rudy-这就是我怀疑的,但它们确实返回“id”。我想你可以用这个加上他们以“init”这个词开头的事实,把他们称为构造函数,但这似乎是一个非常粗糙的解决方案。假设只有这些方法在继承链的某个位置调用[NSObject init],安全吗?我想知道这个信息是否可以被使用。瞧,他必须依靠命名惯例。如果有人决定使用另一个名称(例如createWithBla:),它是不可识别的。@Aran:别忘了还有
[X new]
,这是
[[X alloc]init]
的快捷方式(一个看起来很不错的名称,但仍然可以使用).我如何在没有实例化类成员的情况下对方法*使用它?好吧,那就是…:(我认为最好的方法是使用第二种解决方案(协议)我有点失望,这种模式没有得到语言特性的真正支持。根据我的经验,IOC在Objective-C中并不是一个很有用的模式。我使用过的大多数基于容器/bean的模式只涉及大量的样板代码,以完成Objective-C中很少的代码就可以完成的事情。不要这样做不要误会我的意思;它可能是强大的东西,但只有在IDE完全支持模式并隐藏重复的问题时(我想了解更多关于您想要做什么的信息)