用C/C++的同学一定会觉得本来就是如此,但作为一个一直以Java为生的人,却会认为这是不可思议的. 当然,依然有N多用Java的同学,可能连这个基础都没搞明白,
他们估计以为以下Java代码会改变o的指向,从而让调用方的o对象值发生改变.
void test(Object o) {
o = new MyInt();
o.setInt(12);
}
static void main(String[] args) {
MyInt o = new MyInt();
o.setInt(1);
test(o); //会以为test改变了o对象, 其实不然.
}
Objective-C它也是面向对象, 以上类似的代码也一样是无法改变传入的形参对象的指向, 因为它们形参都是原参对象的指针副本, 更改这个指针副本的指向根本不会影响到原有对象的指向.
那么Objective-C因为是C的超集,它继承了C的指针,以及指针的指针等一系列操作访问
内存的能力, 所以它可以实现在一个函数将形参对象改变指向并影响了调用方真实对象的指向.
void change(MyObject **);
void change(MyObject **prt) {
[(*prt) release];
(*prt) = [[MyObject alloc] init];
(*prt).type = @"Change";
}
int main(void) {
@autoreleasepool {
MyObject *object = [[MyObject alloc] init];
object.type = @"hello it";
change(&object); //通过传入地址,来实现类似于基本类型(int,long)的地址指向的内容的改写.从而达到改变prt的指向
[object release];
}
}