gpt4 book ai didi

objective-c - 如何从协议(protocol)方法描述列表中解密 "objc_method_description"?

转载 作者:搜寻专家 更新时间:2023-10-31 22:12:24 26 4
gpt4 key购买 nike

我有一些 Swift 3 代码来解码 iOS Objective-C 协议(protocol)(它有一个 Swift 对应协议(protocol))。在断定 Swift 3 反射还不足以完成我需要的功能后,我偶然发现了 objc 运行时方法 protocol_copyMethodDescriptionList(),它返回以下 C 结构的数组:

struct objc_method_description
SEL name;
char *types;
};

代码获取协议(protocol)选择器名称列表,但不确定 type 字段中返回的是什么。我对如何正确解码 objc_method_description.type 值感到困惑。

我在 type 字段中得到的是一种神秘格式,例如,"B48@0:8@16{_NSRange=QQ}24@40" 起初我认为这是我如何转换 C 字符串的问题,但经过一些研究,我怀疑它实际上是 参数的编码,类似于 Java 的 JVM 传递方法签名的方式.但我仍然没有解码它的引用。

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

@IBOutlet weak var noteView : UITextView!

func decodeProto() {
var methodCount : UInt32 = 1
if let methodList = protocol_copyMethodDescriptionList(UITextViewDelegate.self,
false, true, UnsafeMutablePointer<UInt32>(&methodCount)) {
for i in 0..<Int(methodCount) {
let methodDesc = methodList[i];
let name = methodDesc.name
let types = String(validatingUTF8: methodDesc.types)
print("\(name) \(types)")
}
}
}

override func viewDidLoad() {
super.viewDidLoad()
decodeProto()
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}

XCode 控制台的输出是:

Optional(textViewDidBeginEditing:) Optional("v24@0:8@16")
Optional(textViewDidEndEditing:) Optional("v24@0:8@16")
Optional(textViewShouldBeginEditing:) Optional("B24@0:8@16")
Optional(textViewShouldEndEditing:) Optional("B24@0:8@16")
Optional(textView:shouldChangeTextInRange:replacementText:) Optional("B48@0:8@16{_NSRange=QQ}24@40")
Optional(textView:shouldChangeTextInRange:replacementText:) Optional("B48@0:8@16{_NSRange=QQ}24@40")
.
.
.

最佳答案

返回的 objc_method_description.type 字段是什么?

  • 一种方法签名编码方案
  • ... 其中包括一个过时的堆栈偏移表示

换句话说,要从 type 字段中获取可用方法签名编码,只需按从左到右的顺序提取字母符号字符,丢弃数字。

支持文档:


关于objective-c - 如何从协议(protocol)方法描述列表中解密 "objc_method_description"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41502199/

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