我想要定义一个方法,它不接受输入参数,但是有一个或多个outParams
。
我不能将方法更改为简单地返回outParam
所需的类型,因为其中许多方法需要多个outParam
值,而且我无法使用集合作为返回类型。
作为一种解决办法,我一直在使用:
- (BOOL)methodName:(NSString*)nothing outParam:(NSData*)foo outParam:(NSData*)bar;
我想要这样的东西:
- (BOOL)methodName outParam:(NSData*)foo outParam:(NSData*)bar;
发布于 2015-07-15 07:22:26
由于objects对象是由指针引用的,因此输出参数使用双指针:
- (BOOL)methodNameWithOutParam:(NSData* __autoreleasing *)foo
outParam:(NSData* __autoreleasing *)bar;
这将允许您在方法内分配自动释放的NSData
对象,并在调用者中使用它们。
这种模式类似于在许多NSError
API中用于处理iOS的模式。但是,这并不理想,因为您必须将指针与设置它们的位置分开声明,即使这两个位置非常接近。
在这种情况下,foo
和bar
NSData
对象很可能是密切相关的。如果是这样的话,考虑将两者“连接”成有意义的东西。这将允许您返回一个对象:
@interface BazData
@property (readwrite, nonatomic) NSData *foo;
@property (readwrite, nonatomic) NSData *bar;
@end
...
- (BazData*)methodName;
发布于 2015-07-15 07:19:58
正如许多Cocoa方法接受NSError **
参数一样,您也可以定义如下方法:
- (BOOL)methodWithOutParam:(NSData * __autoreleasing *)foo outParam:(NSData * __autoreleasing *)bar;
确保在使用这些参数的地方添加一个额外的*。
*foo = [@"Test" dataUsingEncoding:NSUTF8StringEncoding];
发布于 2015-07-15 07:28:35
您不需要有"nothing“输入参数。如果所有的仿射都是外射,那就没关系了。“方法名称”和“参数名称”之间的区别实际上是虚构的--它们都是一个选择器的一部分。所以你可以这样称呼它:
[self myMethodGetFoo:&foo getBar:&bar getBaz:&baz];
请注意,这里没有“空白”或“跳过”参数。它只使用了三个外缘。您可以这样定义这样的方法:
- (BOOL)myMethodGetFoo:(NSData* __autoreleasing *)foo
getBar:(NSData* __autoreleasing *)bar
getBaz:(NSData* __autoreleasing *)baz;
(正如其他答案中所建议的)请再次注意,这个初始的“参数”没有什么“特殊”。您刚刚决定使用双指针来创建外部参数。
(如果您不太清楚为什么外部参数对对象使用双指针,那么这是一个不同的问题,但也是一个常见的挑战。)
https://stackoverflow.com/questions/31434361
复制相似问题