gpt4 book ai didi

iOS/Objective-C 元类和类别

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:47 26 4
gpt4 key购买 nike

我理解一个类实际上是一个对象/struct (objc_class*) 的类型定义。每个类都有一个“支持”元类,它又有一个指向 NSObject 元类的 isa 指针。

NSObject基本上有一个指向自身的 isa 指针。

我们可以通过这一行获取元类:

objc_getMetaClass("<CLASS_NAME>");

我希望到目前为止我对元类的理解没有偏离(如果是,请纠正我)。

我的问题是:

1.)

When would we need to deal with meta class? Could you please cite an example / a scenario in code when we might need to?

2.)

背景:

我在自由思考第三方库及其结构。

通常他们为您提供一个类方法并返回给您一个类,所有其他方法都是私有(private)的/“隐藏的”。大多数时候,虽然它们可以被子类化,但由于我们不知道 init 方法,因此子类化是没有用的。

突然间,我开始考虑Objective-C 类别,从而让我想到Objective-C 元类

这引出了我的问题 #2:

Is it possible to break this structure by making use of Objective-C Category and / or with the use of meta class (by grabbing a hold of it and insert a class method straight there in the meta class)? Or even look up the name of their instance methods that are private?

我的目的不是要“破坏”任何东西,我只是很好奇这些第三方库的结构是如何“牢不可破”的,以及它们的结构是否不能通过使用类别元类

@Leo Natan:

1.)

什么是method_*()

2.)

为了对 Objective-C 运行时的热爱:

你能举一个例子实现吗——调配一个实例方法,比方说,

(我不确定这个方法是否是一个很好的例子,因为我们可以首先覆盖它)

NSArray-count 实例方法(让它总是返回计数 100,例如)

3.)

那么理论上所有类(包括所有第三方库)都可以被break(破坏)?换句话说,没有办法创建“仅调用此类方法或您不能使用我”的 API/库

非常感谢。

最佳答案

当希望查看、添加或修改类方法和类级信息时,元类很有用。

例如,

    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 方法返回的类上使用 class_copyMethodList()NSClassFromString()。您将获得该类(但不是其父类(super class)!)定义的所有实例方法的数组。然后,您可以使用各种 method_*() 方法来检索信息,甚至可能修改这些方法(如实现调配)。

您可以在元类上调用 class_copyMethodList() 以获取定义的所有类方法。

要解决您的“狮子座”问题,

1.请阅读Objective C Runtime Reference .您可以找到处理 Method 结构的 method_ 函数部分。

2。参见 tutorial关于实现调配。

3。使用 Objective C,一切都可用于运行时。不用说,能力越大,责任越大。 Objective C 运行时非常强大。这些 swizzles 非常危险,通常不推荐使用。

关于iOS/Objective-C 元类和类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com