我有一个带有签名的可变函数:
- (id)initWithNumVertices:(NSUInteger)inCount, ...;
但我无法弄清楚如何从变量顶点数构建省略号部分。怎么办呢?
编辑:抱歉,我没有要求编写此函数的方法,我正在寻找一种方法来调用它,使用未知数量的变量。该函数采用结构而不是对象。如果参数的数量已知,我可以这样做:
[[MyObject alloc] initWithNumVertices:4, v[0], v[1], v[2], v[3]];
但是当顶点的数量未知时我该如何调用呢?
答案 0 :(得分:4)
如果在编译时不知道参数的数量,我认为不可能调用可变参数函数。如果要避免使用NSArray
的开销,将多个C结构传递给方法的标准方法是使用标准C数组。
- (id)initWithVertices:(Vertex *)vertices count:(NSUInteger)count;
NSIndexPath
的{{1}}是一个使用此模式的示例,还有其他各种模式,在Cocoa中相当常见。
答案 1 :(得分:1)
编辑:只使用原生C数组。可变方法对你没有帮助。
在您的情况下,由于您有一个未指定数量的参数,您必须以这种形式重写它:
- (id)initWithVertices:(vertex)firstVertex;
运行一个while循环,直到它到达指定为非法的顶点(这将是你的断点),有点像这样:
vertex currentVertex, invalidVertex = // some invalid value, like {-1, -1}
while ((currentVertex = va_arg(args, vertex) != invalidVertex) {
// initialization code with the current vertex
// when we hit 'invalidVertex', which will be at the end of the list, stop
}
像这样的代码必须像这样运行:
[[MyObject alloc] initWithVertices:firstVertex, secondVertex, thirdVertex, nullVertex];
nullVertex
必须位于列表的末尾才能指定最后一个有效顶点(很像NSArray
的{{1}}方法必须arrayWithObjects:
在列表的末尾)。
答案 2 :(得分:0)
您是否在询问如何区分参数?
[[YourObject alloc] initWithNumVertices:7, 8, 9, 10];
编辑|哦,我想我明白了你在问什么。您想动态调用此方法,例如使用objc_msgSend()
或NSInvocation
?如果是这样的话,请忽略我的答案。
答案 3 :(得分:0)
如果你还没有,请查看libffi(`man ffi'):
说明 外部函数接口提供了一种机制 函数可以生成一个调用 运行时的另一个函数没有 需要知识 编译时调用函数的接口。
如果我理解正确,您应该可以使用此方法调用objc_msgSend()
。