OC里面经常会有这样的需求,函数内部修改外面穿进来的参数, 比如一些错误处理,OC很多使用的是NSError对象而不是异常处理,外面声明一个NSError空对象,传给一个带有该参数的函数,然后错误信息会被放在这个NSError对象里面。
具体需要怎样去做呢,比如:
void test(MyObject **str) {
*str = [[MyObject alloc] initWithTag:2];
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
MyObject *string1 = [[MyObject alloc] initWithTag:1];
test(&string1);
}
return 0;
}
这里非常重要的一点就是理解&p的含义,&p的真正含义是指针p的地址,而p指的才是指针p里面保存的某个对象的地址,而*p表示的才是指针p指向的某个对象。
按照这样的思路,str存储的是某个指针的地址,这里也就是string1的地址,*str表示取得这个地址中的对象,也就是外面那个指针,也就是外面指针指向对象的地址。修改这个地址上面的数据,也就达到了按引用传递的效果。
还有一点,给对象赋值是修改这块地址的内容,而这块地址的内容和这块地址又不是一个概念了。