iOS / Objective-C元类和类别

时间:2013-12-30 17:40:52

标签: ios objective-c metaclass objective-c-runtime objective-c-category

我理解一个类实际上是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>

非常感谢。

1 个答案:

答案 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运行时非常强大。这些混合非常危险,通常不推荐。