我理解一个类实际上是struct(objc_class*)
的object / typedef。
每个类都有一个“支持”元类,它又有一个指向NSObject
元类的isa指针。
NSObject
基本上有一个指向自身的isa指针。
我们可以通过这一行获得元类:
objc_getMetaClass("<CLASS_NAME>");
我希望到目前为止我对meta class的理解并不在这里(请纠正我,如果是的话)。
我的问题是:
1。)
我们什么时候需要处理元类?你能引用一下吗? 示例/我们可能需要的代码中的场景?
2。)
背景
我正在思考第三方图书馆以及它们的结构。
通常他们为您提供一个类方法并返回一个类,所有其他方法都是私有/“隐藏”。大多数情况下,虽然它们可以被子类化,但由于我们不知道init
方法,因此子类化是没用的。
突然间,我开始考虑 Objective-C Category ,从而引导我思考 Objective-C元类。
这导致了我的问题#2:
是否可以通过使用 Objective-C来破坏这种结构 类别和/或使用元类(通过抓住 它并在元类中直接插入一个类方法)?要么 甚至查找私有实例方法的名称?
我的意图不是“打破”任何东西,我只是非常好奇这些第三方图书馆是如何“牢不可破”的,如果他们的结构不能通过使用类别“打破”和 Meta Class 。
@Leo Natan:
的 1)。 的
什么是method_*()
?
的 2)。 的
对于对Objective-C Runtime的喜爱:
你能引用一个示例实现 - 调整实例方法,比方说,
(我不确定这种方法是否是一个很好的例子,因为我们可以在第一时间覆盖它)
NSArray
的{{1}}实例方法(例如,让它返回总是计数为100)
第3。) 的
所以理论上所有类(包括所有第三方库)都可以中断(破坏)?换句话说, 没有办法创建“只调用此类方法 - 或者你不能使用我”API /库 ?< / p>
非常感谢。
答案 0 :(得分:6)
当希望查看,添加或修改类方法和类级别信息时,元类很有用。
例如,
IMP myIMP = imp_implementationWithBlock(^(id _self, NSString *string) {
NSLog(@"Hello %@", string);
});
Class cls = objc_getMetaClass("NSString");
class_addMethod(cls, @selector(test:), myIMP, "v@:@");
[NSString test:@"lala"];
要获取实例方法,请对class_copyMethodList()
方法在对象或class
上返回的类使用NSClassFromString()
。您将获得该类定义的所有实例方法的数组(但不是其超类!)。然后,您可以使用各种method_*()
方法来检索信息,甚至可能修改这些方法(如实现调整)。
您可以在元类上调用class_copyMethodList()
以获取定义的所有类方法。
要解决您的“青少狮”问题,
1。
请阅读Objective C Runtime Reference。您可以找到处理method_
结构的Method
函数的一部分。
2。 有关实施调整的信息,请参阅tutorial。
3。 使用Objective C,运行时可以使用所有内容。不用说,强大的力量带来了巨大的责任。 Objective C运行时非常强大。这些混合非常危险,通常不推荐。