c - 什么是双星(例如 NSError **)?

所以,我看到了这个:

error:(NSError **)error

在苹果文档中。为什么是两星?有什么意义?

最佳答案

“双星”是指向指针的指针。所以 NSError ** 是一个指向 NSError 类型对象的指针。它基本上允许您从函数返回错误对象。您可以在函数中创建一个指向 NSError 对象的指针(称为 *myError),然后执行以下操作:

*error = myError;

将该错误“返回”给调用者。


回复下面的评论:

您不能简单地使用 NSError *,因为在 C 中,函数参数是按值传递的——也就是说,值是复制 当传递给函数时。为了说明,请考虑以下 C 代码片段:

void f(int x)
{
    x = 4;
}

void g(void)
{
    int y = 10;
    f(y);
    printf("%d\n", y);    // Will output "10"
}

f()x 的重新赋值不会影响 f() 之外的参数值(在 g( ),例如)。

同样,当指针传入函数时,它的值会被复制,重新赋值不会影响函数外的值。

void f(int *x)
{
    x = 10;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%p\n", z);    // Will print the value of z, which is the address of y
    f(z);
    printf("%p\n", z);    // The value of z has not changed!
}

当然,我们知道我们可以很容易地改变 z 所指向的值:

void f(int *x)
{
    *x = 20;
}

void g(void)
{
    int y = 10;
    int *z = &y;
    printf("%d\n", y);    // Will print "10"
    f(z);
    printf("%d\n", y);    // Will print "20"
}

所以按理说,要改变 NSError * 所指向的值,我们还必须传递一个指向该指针的指针。

https://stackoverflow.com/questions/604099/

相关文章:

objective-c - 如何制作真正的私有(private)实例变量?

ios - 电子邮件镇静 iOS 8

objective-c - NSMutableArray 按顺序添加对象

iphone - 如何将@selector 作为参数传递?

ios - 如何从 UIGestureRecognizer 获取 UITouch 位置

objective-c - Objective-C 2.0 中的可选参数?

iphone - 如何在 NSSet 或 NSArray 中搜索具有特定属性的特定值的对象?

iphone - iOS 设备作为 Web 服务器

ios - iPhone:在 UITextField 上禁用 Auto-Cap/autocorrec

objective-c - AFNetworking 2.0 AFHTTPSessionManage