gpt4 book ai didi

ios - objective-c 语法和 C 语法的不同结果

转载 作者:行者123 更新时间:2023-11-28 23:41:15 31 4
gpt4 key购买 nike

我有以下方法部分

- (NSString*) GetPathForFolder:(int)folder inDomains:(int) domains {
id cls = objc_getClass("NSFileManager");
SEL defaultManagerSelector = @selector(defaultManager);
SEL urlsForDirectoryInDomainsSelector = @selector(URLsForDirectory:inDomains:);

id fileMangerHandle = objc_msgSend(cls, defaultManagerSelector);

//NSArray<NSURL *>* notUsedArray = [fileMangerHandle URLsForDirectory:folder inDomains:domains];
NSArray<NSURL *>* resultArray = (NSArray<NSURL *>*) objc_msgSend(fileMangerHandle, urlsForDirectoryInDomainsSelector, folder, domains);
return [resultArray lastObject].absoluteString;
}

使用 [self GetPathForFolder:5 inDomains:1] 调用此方法返回file:///Applications/这是错误的

我取消注释 NSArray<NSURL *>* notUsedArray.. 的那一刻line I get a different and correct value 恰好与来自

的值相同

调用的 objective-c 版本做了哪些我在 C 版本中没有做的事情?

更新:

  1. 我正在使用 objc_msgSend因为这个方法最终会从 C# 调用,但首先在 Objective-C 中尝试它比开始担心互操作部分更容易。
  2. 我正在使用 sel_registerName因为在 C# 中运行它时,我将不得不自己注册。

更多关于 C# 和 objective-c 之间的互操作 here .还有我想了解的 Java 版本是 here .

最佳答案

你不能像这样使用 objc_msgSend,它不是一个可变参数函数,尽管它的原型(prototype)暗示了它。编译器需要使用方法所期望的相同调用约定。为此,它需要知道所有参数的确切类型。您可以通过将 objc_msgSend 转换为具有正确参数的函数指针类型来告诉它。

所以对于这种情况,你会使用这样的东西:

typedef NSArray<NSURL *> *(*UrlsForDirectoryType)(id, SEL, NSUInteger, NSUIteger);
NSArray<NSURL *>* resultArray = ((UrlsForDirectoryType)objc_msgSend)(fileMangerHandle, urlsForDirectoryInDomainsSelector, folder, domains);

当然,typedef 是可选的,但这会使整个内容更难阅读。

要将其暴露给不同的编程语言,您还可以在 Objective-C 中编写常规 C 函数并调用它们。这比直接处理运行时要容易得多。

关于ios - objective-c 语法和 C 语法的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53391836/

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