iOS 关于NSError传递实参(指针)

在使用NSError时常用传递实参的方式&error。ARC下,如下代码

- (void)showError
{
    NSError *error = nil;
    NSLog(@"%p", &error);
    [self handleResponseCode:0 error:&error];
}

- (void)handleResponseCode:(NSInteger)code error:(NSError **)err
{
    NSLog(@"%p", err);
    if (code == 0) {
        *err = [NSError errorWithDomain:NSCocoaErrorDomain code:code userInfo:@{@"code":@(code)}];
    }
}

NSError *error = nil;分配了一个栈内存&error,内容为nil,即没有指向一个NSError实例(堆内存)。

在调用handleResponseCode:error:时传递了实参&error。既然是实参,那么分别打印error的地址应该是一样的吧?

看一下结果

0x7ffeecfcba58
0x7ffeecfcba40

咦?为什么不一样呢

在handleResponseCode:error:方法里 error类型只写了NSError**,但是对于参数编译器默认是这样的 

- (void)handleResponseCode:(NSInteger)code error:(NSError *__autoreleasing*)error

而NSError *error = nil,

其中也隐藏了ownership(所有权),实际上是NSError * __strong error = nil;

编译时,编译器做了这些事情 :

    NSError *__strong error = nil;
    NSError __autoreleasing *e = error;
    [self handleResponseCode:0 error:&e];
    error = e;

方法handleResponseCode:error:中不需要管理参数error的引用计数,这里会生成一个__autoreleasing的临时变量,所以出现了实参传递过程中不是同一个对象。

 

展开阅读全文

没有更多推荐了,返回首页