【问题标题】:Determining if an Objective-C method is variadic during runtime确定 Objective-C 方法在运行时是否可变参数
【发布时间】:2026-01-11 11:30:01
【问题描述】:

有没有办法在运行时查明给定方法是否是可变参数类型? method_getTypeEncoding() 之类的东西;这不会告诉我一个方法是否接受可变数量的参数。或者说有什么诀窍?

【问题讨论】:

  • 你能解释一下你想要这些信息的背景吗?我不确定如何在运行时准确找到它,但我也从来不需要构建很多可变参数方法。基本上我得到的可能是你不需要知道并且有一个更大的问题。也许,但我也可能总是错的:)
  • 当你在一个veridic方法上调用method_getNumberOfArguments()会发生什么?我从未尝试过,但也许它会返回一个特殊值(如 -1 或其他值)?另见method_copyArgumentType()
  • @user1118321 method_getNumberOfArguments 返回最小计数,就像它是普通方法一样。
  • AFAIK 不可能通过 method_*、NSMethodSignature,因为可变参数的编码方式与非可变参数相同。 IOW (int)a, ... 被编码为 'i',等于简单的 (int)a(也是 'i')。不支持自省 AFAIK。也许@bbum 可以对此有所了解...

标签: objective-c runtime objective-c-runtime variadic-functions method-signature


【解决方案1】:

罗伯特的评论是正确的。考虑:

@interface Boogity
@end
@implementation Boogity
- (void)methodWithOneIntArg:(int)a {;}
- (void)variadicMethodWithIDSentinel:(id)a, ... {;}
@end

在生成的二进制文件上运行strings(还有股票main()):

strings asdfasdfasdf 
Boogity
methodWithOneIntArg:
variadicMethodWithIDSentinel:
v20@0:8i16
v24@0:8@16
Hello, World!

如果我将可变参数方法更改为声明为- (void)variadicMethodWithIDSentinel:(int)a, ...,则strings 输出变为:

Boogity
methodWithOneIntArg:
variadicMethodWithIDSentinel:
v20@0:8i16
Hello, World!

所以,不,没办法说。

【讨论】: