在之前学习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"];
}
这里的运行结过如下
并没有得到我们想要的东西,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);
}
这次我们得到的结果是这样的
我们都知道指针是什么,指针存储对象地址的特殊类型,也是占有一定内存的,当我们把 p 传给 aPeople 的时候只是把 p 中存储的那个地址传给了 aPeople ,当创建对象的时候 就是 改变了 aPeople 这个指针中存储的地址,并没有改变 p 所存储的地址,所以此时 p 还是 nil 的,当我们使用了双指针,用 &p 传值 也就是把 p 的地址 传给了 *aPeople ,这个也叫引用传值,把指针的地址作为参数传递,当我们创建对象的时候,其实就是使用 p 指向的地址来 创建对象,这样我们就能给 p 指向的地址赋值了。请看图理解