gpt4 book ai didi

ios - 如何使用将指向对象的指针作为参数的方法创建 NSInvocation 对象

转载 作者:可可西里 更新时间:2023-11-01 05:38:20 27 4
gpt4 key购买 nike

我想使用一个将指向 NSError 对象的指针作为参数的方法来创建一个 NSInvocation 对象。这方面的一个例子是方法 -

- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)mask error:(NSError **)errorPtr

我明白我会像这样设置我的调用

NSData *myData = [[NSData alloc] init];

SEL writeToFileSelector = @selector(writeToFile:options:error:);
NSMethodSignature *signature = [NSData instanceMethodSignatureForSelector:writeToFileSelector];

NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
[invocation setTarget:myData];
[invocation setSelector:writeToFileSelector];

NSString *string = [NSString stringWithFormat:@"long cat"];
NSDataWritingOptions *dataOptions;
*dataOptions = NSDataWritingFileProtectionComplete;

[invocation setArgument:&string atIndex:2];
[invocation setArgument:&dataOptions atIndex:3];

对于 writeToFile:Options:Error:最后一个参数期望接收一个指针而不是一个对象。结果,执行以下操作不起作用 -

NSError *err = nil;
[invocation setArgument:&err atIndex:4];

解决方案可能是创建指向指针的指针,这似乎合乎逻辑,但这会导致编译器警告。我不确定如何正确执行它并且不会造成内存管理问题。

最佳答案

您创建的参数与您传递给该方法的任何其他参数一样。

正如您所指出的,方法签名需要一个 NSError ** 作为它的最后一个参数(索引 4)。因此,您需要声明一个,但有一点问题。

NSError **errorPointer

给你一个指向 NSError 变量的变量。但是,由于您没有告诉它指向任何变量,它指向 nil。因此,当您触发调用时,选择器将无法更改您的错误指针指向的变量。换句话说,这就像调用 [myData writeToFile:string options:dataOptions error:NULL]

因此,您还需要声明一个 NSError 变量,并将其地址分配为您的 errorPointer 应指向的变量:

NSError *error;
NSError **errorPointer = &error;

现在您可以将 errorPointer 作为参数传入,如果调用该方法时出现问题,您将能够稍后检查它。查看this post on NSInvocation寻求更多帮助(向 Mark Dalrymple 致敬以指出博文)

同样重要的是要认识到,对于您创建并传递到调用中的参数,应考虑范围。看看我问过的类似问题here .

关于ios - 如何使用将指向对象的指针作为参数的方法创建 NSInvocation 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9986899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com