gpt4 book ai didi

objective-c - Objective-C 有反射吗?

转载 作者:太空狗 更新时间:2023-10-30 03:12:46 28 4
gpt4 key购买 nike

我正在研究Objective-C,我想知道它是否有反射的概念。到目前为止,我找到的所有文档都没有描述反射。

最佳答案

Runtime Reference 中描述了运行时函数它不仅允许查询类或实例的特性,还允许添加方法,甚至在运行时创建新类。我说这是一种非常动态的反射,通常不适用于基于 C 的语言。 Mike Ash's wrappers是围绕它的 Objective-C 包装器。同样,它甚至可以添加方法! Cocoa 的基类 NSObject 也为许多运行时函数提供包装器,参见 NSObject protocol reference .例如

     [foo respondsToSelector:@selector(bar:)];

if([foo isKindOfClass:[NSString class]]){ ... }

做方法名称所说的。您甚至可以即时添加方法。例如,

   #import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface Foo:NSObject
{
}
@end
@implementation Foo
-(void)sayHi
{
NSLog(@"Hi! from %@",NSStringFromSelector(_cmd));
}
+(BOOL)resolveInstanceMethod:(SEL)sel
{
Method method=class_getInstanceMethod(self,@selector(sayHi));
class_addMethod(self,sel,method_getImplementation(method),method_getTypeEncoding(method));
return YES;
}
@end

int main(){
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
Foo* foo=[[Foo alloc] init];
[foo aeiou];
[foo bark];
[foo mew];
[pool drain];
return 0;
}

这会产生输出

  Hi! from aeiou
Hi! from bark
Hi! from mew

它的作用如下:

  1. SEL 是表示已发送消息(或方法调用,在其他术语中)的变量。
  2. 如果发送到实例的消息未在类中实现,则 Objective-C 运行时调用类的 resolveInstanceMethod:
  3. 因此,在这种情况下,我只是将名为 sayHi 的预定义方法的实现复制到该方法的实现中。
  4. 从该方法中,您可以使用_cmd 查看调用该方法时使用的选择器。因此,即使是单个 sayHi 实现,我们也可以获得不同的输出。

Cocoa 的一些标准实现(特别是键值编码、键值观察和核心数据)使用运行时来动态修改类。

关于objective-c - Objective-C 有反射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7550012/

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