我想定义一个不带输入参数但有一个或多个outParams
的方法。
我无法更改方法以简单地返回outParam
所需的类型,因为它们中的许多都需要多个outParam
值,而且我将无法使用集合作为返回类型。< / p>
作为我一直在使用的解决方法:
- (BOOL)methodName:(NSString*)nothing outParam:(NSData*)foo outParam:(NSData*)bar;
我希望有类似的东西:
- (BOOL)methodName outParam:(NSData*)foo outParam:(NSData*)bar;
答案 0 :(得分:2)
由于Objective-C对象由指针引用,因此输出参数使用双指针:
- (BOOL)methodNameWithOutParam:(NSData* __autoreleasing *)foo
outParam:(NSData* __autoreleasing *)bar;
这将允许您在方法中分配自动释放NSData
对象,并在调用者中使用它们。
此模式类似于许多iOS API中用于处理NSError
的模式。但是,这并不理想,因为您必须将指针与它们所在的位置分开声明,即使这两个位置非常接近。
在这种情况下,foo
和bar
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使用对象的双指针有点模糊,这是一个不同的关注,但是一个共同的挑战。)