gpt4 book ai didi

objective-c - NSObject 上的类别也适用于类

转载 作者:太空狗 更新时间:2023-10-30 03:52:29 24 4
gpt4 key购买 nike

所以我在 NSObject 上有一个名为 CustomCategory 的类别,如下所示:

#import <Foundation/Foundation.h>

@interface NSObject (CustomCategory)

-(BOOL)doSomething;

@end

#import "NSObject+CustomCategory.h"

@implementation NSObject (CustomCategory)

-(BOOL)doSomething
{
NSLog(@"Done");
return NO;
}

@end

理想情况下,这将适用于这样的对象:

NSObject* object = [NSObject new];
[object doSomething];

不过,我发现这样也可以正常工作:

[NSObject doSomething];

所以我想知道,既然是我通过类别添加的实例方法,为什么它也适用于类?

最佳答案

NSObject 上的实例方法也是 NSObject 上的类方法。

之所以可行,是因为 Objective-C 进行动态调度的方式。如果您向任何对象发送消息,则会在对象类中查找方法实现。如果您向类发送消息,那么您就是在向类对象发送常规消息。在所谓的元类中查找实现。元类由编译器自动生成。类方法只是元类的实例方法。这由编译器透明地处理。

继承也适用于元类级别。因此,类的元类继承自其父类(super class)的元类。我们在那里有两个平行的继承层次结构。只有像 NSObject 这样的根类的处理方式不同。由于没有父类(super class),因此元类无法从父类(super class)的元类继承。对于根类,元类继承自根类本身。

并且由于类的类方法是其元类的实例方法,而 NSObjects 元类继承自 NSObject 本身,NSObject 上的实例方法也是 NSObject 上的类方法。

关于objective-c - NSObject 上的类别也适用于类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171147/

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