双指针

/ 0评 / 0

在之前学习C语言的时候学过一点指针的基础知识,然后在学习OC的时候都是各种的 指针符号,有时候我们也会遇到 ** 这种的双指针符号,那表示的是什么呢?我们来看一下

     NSError *error = nil;
     BOOL isSuccess = [@"123" writeToFile:nil atomically:YES encoding:nil error:&error];
     if (isSuccess){
     }else{
     	NSLog(@"error  %@",[error localizedDescription]);
     }
   

这是我们遇到的其中一种情况,但是为什么这样写呢?我们来看一个例子

- (void)test1{
    People *p = nil;
    // p   实际参数(实参)
    [self testPeople:p];
    
    NSLog(@"p  %@",p);

    NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];
    [self testArray:array];
    
    NSLog(@"array  %@",array);
}


// aPeople 叫做形式参数 (形参)
// 调用方法时 方法内部会把传进来的指针复制一份
- (void)testPeople:(People *)aPeople{
    aPeople = [[People alloc] init];
    NSLog(@"aPeople  %@",aPeople);
}

- (void)testArray:(NSMutableArray *)aArray{
    [aArray addObject:@"4"];
}	

这里的运行结过如下

doublepoint 003

并没有得到我们想要的东西,p 依然是一个 null,那我们看一下使用双指针的效果

- (void)test2{
    // 为什么通过指针可以操作某个对象
    // 因为指针内部在记录着对象的内存地址
    //    UILabel *label = [[UILabel alloc] init];
    //    label.text = @"123";
    
    // 指针本身占不占内存?
    // 本身也占内存地址
    
    People *p = nil;
    // p   实际参数(实参)
    // &p 取p的地址,也叫引用传值
    //    id *p1 = &p;
    
    [self createPeople:&p];
    
    NSLog(@"p  %@",p);
}

// aPeople 叫做形式参数 (形参)
// 调用方法时 方法内部会把传进来的指针复制一份
- (void)createPeople:(People **)aPeople{
    // *aPeople 指 取aPeople的内容
    *aPeople = [[People alloc] init];
    NSLog(@"aPeople  %@",*aPeople);
}

这次我们得到的结果是这样的

doublepoint 004

我们都知道指针是什么,指针存储对象地址的特殊类型,也是占有一定内存的,当我们把 p 传给 aPeople 的时候只是把 p 中存储的那个地址传给了 aPeople ,当创建对象的时候 就是 改变了 aPeople 这个指针中存储的地址,并没有改变 p 所存储的地址,所以此时 p 还是 nil 的,当我们使用了双指针,用 &p 传值 也就是把 p 的地址 传给了 *aPeople ,这个也叫引用传值,把指针的地址作为参数传递,当我们创建对象的时候,其实就是使用 p 指向的地址来 创建对象,这样我们就能给 p 指向的地址赋值了。请看图理解

doublepointer 001

doublepointer 002

代码请查看 http://git.oschina.net/zcb1603999/LearningiOS

评论已关闭。