通过运行时调用一个块,有什么类似于 NSInitation 的吗?

2023-12-02

我有未知类型的块(如id) 和需要传递到该块的参数数组。参数可以是对象或装箱为 NSNumber/NSValue 的数字/结构。 Block 还可以返回一个对象、数字或结构。这是一个库代码,参数的类型事先是未知的。

假设我可以动态地从块描述符中读取签名,有没有办法构建类似 NSInitation 的东西来调用块?


令人惊讶的是,这有效:

CGAffineTransform (^block)(id x, int y, CGSize z) = ^(id x, int y, CGSize z){
    NSLog(@"%@,%d,%@", x, y, NSStringFromCGSize(z));
    CGAffineTransform t = { 1, 2, 3, 4, 5, 6 };
    return t;
};

NSMethodSignature* sign = [NSMethodSignature signatureWithObjCTypes:block_signature(block3)];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sign];
[invocation setTarget:block3];
void* x = (__bridge void*)@"Foo";
int y = 42;
CGSize z = { 320, 480 };
[invocation setArgument:&x atIndex:1];
[invocation setArgument:&y atIndex:2];
[invocation setArgument:&z atIndex:3];
[invocation invoke];
CGAffineTransform t;
[invocation getReturnValue:&t];

但另一方面,这并不:

NSMethodSignature* sign = [self methodSignatureForSelector:@selector(class)];
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sign];
[invocation setTarget:block];
[invocation setSelector:@selector(class)];
[invocation invoke];
Class k = nil;
[invocation getReturnValue:&k];

AFAICS从拆解、实施[NSInvocation invoke]检查目标的类,如果它是一个块(NSBlock)然后它总是调用块函数,无论签名如何。

Updated:报告为雷达://25289979

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过运行时调用一个块,有什么类似于 NSInitation 的吗? 的相关文章

  • 如果 [super init] 返回 nil 为什么不抛出异常?

    这被认为是典型的 id init self super init if self lt initializations gt return self 但选择这样的实际上能做出适当响应的东西不是更好吗 id init self super i
  • 如何更改表格单元格的详细信息披露按钮的颜色

    我想更改表格单元格的详细信息披露按钮的颜色 提前致谢 你必须创建一个自定义的UIButton并将其设置为单元格的附件视图 Your cellForRowAtIndexPath 看起来像下面这样 UITableViewCell tableVi
  • 模态 Segue,导航栏消失

    我正在使用 Xcode 4 6 1 在 Objective C 上进行编码 我想知道当我在两个视图控制器之间创建模态转场时如何保持导航栏显示 因为我正在故事板中进行转场 并且当我运行应用程序时 第二个视图控制器的导航栏消失 并且我在该栏上有
  • AFNetworking 同步调用(类似/不同)

    我需要实施喜欢 不喜欢应用程序中的功能 所有 API 调用均通过AFNetworking和成功 错误处理程序 iOS 块 问题是 当用户在短时间内多次单击某个按钮时 服务器会以错误的顺序接收某些请求 然后一切都会变得错误 例如发生双重喜欢或
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • 未调用[super方法]时发出警告

    不使用 ARC 时 如果未在 dealloc 方法中调用 super dealloc 您会收到警告 我正在尝试实现与经常被子类化的类类似的东西 以在实现子类的人不调用 super 时警告他们 有任何想法吗 llvm的最新版本添加了一个属性
  • iOS 64 位 @try {... } @catch {...} 不起作用

    我有一个非常特殊的问题 最近 我向我的 iOS 项目 arm64 添加了 64 位支持 从那时起 我开始收到内部代码段未捕获的异常 try catch 我使用 Crashlytics 进行崩溃报告 我设法在应用程序中的任何位置使用以下代码行
  • iOS:两个 UIAlert 具有两种不同的委托方法

    我有一个 UIAlert UIAlertView alertView UIAlertView alloc initWithTitle ok message Canc delegate self cancelButtonTitle OK ot
  • 如何制作字幕 UILabel / UITextField / NSTextField

    我需要制作字幕UILabel在 Xcode 中 选取框将从右向左滚动 我试过CCScrollingLabel also JHTickerView和别的 但我找不到带有选框的简单代码 没有任何视图 数组 一些愚蠢的库和其他库 如何制作选框UI
  • 如何在 UICollectionView PerformBatchUpdates 块中排序移动、插入、删除和更新?

    In my UICollectionView 我使用一个简单的自定义对象数组来生成和显示单元格 有时数据会发生变化 我想一次性为所有变化添加动画效果 我选择通过跟踪第二个数组中的所有更改 比较两个数组并在一个数组内生成一组移动 插入 删除和
  • 从 iPhone 上的 NSString 中删除 HTML 标签

    有几种不同的方法可以删除HTML tags从一个NSString in Cocoa One way http cocoa karelia com Foundation Categories NSString Flatten a string
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下
  • 如何阻止我的应用程序设置“隔离”位?

    从 OS X 10 7 3 开始 我的文本编辑器就在它接触的任何文件上设置 隔离 位 我的文本编辑器设计用于处理 shell 脚本 如果设置了隔离位 则无法从命令行执行 shell 脚本 直到您在 Finder 中双击它并浏览 此应用程序是
  • 解析后 UITableView 委托和数据源在单独的类中

    我需要从一个单独的类设置 UITableView 委托和数据源 方法调用解析后数据准备就绪 但每次我的表都是空的 我正在使用 ARC 这是简化的代码 HomeViewController h import
  • 如何在 iPhone 应用程序的 url 中传递字符串值

    NSURLRequest request NSURLRequest requestWithURL NSURL URLWithString http www krsconnect no community api html method ba
  • 快速找到一个数字的下一个倍数的方法

    我需要找到从基数开始的数字的第一个倍数 例如 7 中 3 的第一个倍数是 9 我的第一次尝试是这样做 multiple baseNumber while multiple number 0 multiple 最后 multiple 将具有第
  • 使用捏合手势;如何放大用户手指实际“捏”的位置?

    我已经在我的应用程序中的 UIImageView 上实现了 UIPinchGestureRecognizer 但是无论我在图像的哪个位置捏合 它似乎都会放大到同一个位置 有谁知道我如何让它放大到用户实际 捏 的地方 请参阅下面的代码 视图控
  • UIAlertView 中的 MPVolumeView?

    是否可以将 MPVolumeView 放入 UIAlertView 中 我已经尝试过put它在里面 但不显示 这可能是sizeToFit or initWithFrame 部分 有没有办法测试是否MPVolumeView实际上正在被创建吗
  • 连接到 Apple Music

    所以我尝试使用 React Native 应用程序从 iOS 设备连接到 Apple Music 有一个 API 可以执行相同的操作 但我需要从 storekit 框架调用一个函数 提出个性化请求 苹果音乐API https develop
  • UITextInput setMarkedText:selectedRange 不起作用? (不可能!)

    我想以编程方式设置标记的文本 并且由于 iOS5 UITextView 和 UITextField 符合 UITextInput 这应该是可能的 但由于某种原因我总是得到markedText为零 我在这里缺少什么 这是我尝试过但没有成功的方

随机推荐