没有输入参数但带有outParam的方法签名

时间:2015-07-15 15:15:36

标签: objective-c

我想定义一个不带输入参数但有一个或多个outParams的方法。

我无法更改方法以简单地返回outParam所需的类型,因为它们中的许多都需要多个outParam值,而且我将无法使用集合作为返回类型。< / p>

作为我一直在使用的解决方法:

- (BOOL)methodName:(NSString*)nothing outParam:(NSData*)foo outParam:(NSData*)bar;

我希望有类似的东西:

- (BOOL)methodName outParam:(NSData*)foo outParam:(NSData*)bar;

3 个答案:

答案 0 :(得分:2)

由于Objective-C对象由指针引用,因此输出参数使用双指针:

- (BOOL)methodNameWithOutParam:(NSData* __autoreleasing *)foo
                      outParam:(NSData* __autoreleasing *)bar;

这将允许您在方法中分配自动释放NSData对象,并在调用者中使用它们。

此模式类似于许多iOS API中用于处理NSError的模式。但是,这并不理想,因为您必须将指针与它们所在的位置分开声明,即使这两个位置非常接近。

在这种情况下,foobar NSData个对象可能密切相关。如果是这样,请考虑制作一种将两者“连接”在一起的类型。这将允许您返回单个对象:

@interface BazData
@property (readwrite, nonatomic) NSData *foo;
@property (readwrite, nonatomic) NSData *bar;
@end
...
- (BazData*)methodName;

答案 1 :(得分:1)

正如许多Cocoa方法接受NSError **参数一样,您可以按如下方式定义方法:

- (BOOL)methodWithOutParam:(NSData * __autoreleasing *)foo outParam:(NSData * __autoreleasing *)bar;

确保在使用这些参数时添加额外的*,例如

*foo = [@"Test" dataUsingEncoding:NSUTF8StringEncoding];

答案 2 :(得分:1)

你不需要&#34;什么都没有&#34;输入参数。如果所有参数都是outparams,那就没问题。 &#34;方法名称&#34;之间的区别和&#34;参数名称&#34;实际上是一种虚构的东西 - 它们都是一个选择器的一部分。所以你可以这样打电话:

[self myMethodGetFoo:&foo getBar:&bar getBaz:&baz];

请注意,没有&#34;空格&#34;或&#34;跳过&#34;参数在这里。它只使用三个outparams。您可以定义这样的方法:

- (BOOL)myMethodGetFoo:(NSData* __autoreleasing *)foo
                getBar:(NSData* __autoreleasing *)bar
                getBaz:(NSData* __autoreleasing *)baz;

(正如其他答案所示)再次注意,没有什么&#34;特别&#34;关于那个初始&#34;参数&#34;。您刚刚决定使用双指针来创建outparam。

(如果你对为什么outparams使用对象的双指针有点模糊,这是一个不同的关注,但是一个共同的挑战。)