gpt4 book ai didi

objective-c - 运行时记录的协议(protocol)名称

转载 作者:行者123 更新时间:2023-12-03 16:57:57 24 4
gpt4 key购买 nike

例如,我有以下代码:



@interface LOSHeadlineMetricsService : NSObject {

id 委托(delegate);

}

协议(protocol)看起来像

@protocol LOSHeadlineMetricsServiceDelegate <NSObject>

- (void) serviceDidComplete;

- (void) serviceFailed;

@end

在委托(delegate)客户端运行时,我想引发一个异常,该异常通过反射抛出协议(protocol)“LOSHeadlineMetricsServiceDelegate”的名称。我怎样才能实现这一目标?

if (self.delegate == nil) {
[NSException raise:@"NOT IMPLEMENTED" format:@"%s", Reflection(self.delegate)]
}

最佳答案

您可以从property_getAttributes()返回的属性属性中解析它。功能。任何属性的类型都可以通过检查第一个字符 ( defined to be a 'T' ) 和第一个逗号之间的文本来确定。对于对象类型,此文本的格式为@“ClassName”。 id类型属性将只有 @ 符号,没有引号、类名或协议(protocol)名称。您可能可以使用 NSScanner无论您的偏好是什么,这里都相当有效,或者是正则表达式。

示例程序及其输出:

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

@protocol MyProtocol <NSObject>
- (void)someMethod;
@end

@interface MyObject : NSObject
@property (strong) id<MyProtocol> implementor;
@end

@implementation MyObject
@end

int main(int argc, const char * argv[])
{

@autoreleasepool {
objc_property_t property = class_getProperty([MyObject class], "implementor");
const char *propertyAttributes = property_getAttributes(property);
NSLog(@"property attributes = %s", propertyAttributes);
}
return 0;
}

程序的输出是

2013-03-28 16:39:17.401 PropertyReflection[56502:303] property attributes = T@"<MyProtocol>",&,V_implementor

现在,正如 Kevin Ballard 指出的那样,谨慎地注意到这种行为与文档相矛盾,文档指出 T 后面的字符串是 @encode属性类型的字符串。当我写这篇文章时,我就假设情况确实如此。然而检查后,结果是@encode(id<MyProtocol>)确实只是“@”,所以使用它需要您自担风险。当然,解析该字符串的任何代码都必须准备好优雅地失败,并且不能依赖于任务关键型数据提取。如果这些信息更多地是为了方便而不是必需,那么我认为继续下去是合适的。

关于objective-c - 运行时记录的协议(protocol)名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15692964/

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