我试图在代码中尽可能少地使用内存。我尝试过两种将自定义类对象发送到方法的方法。我不确定这两种方法是否有什么区别。假设我有两个类,Class1和Class2,每个类都有自己的类变量和方法。
所有代码都是用Class1编写的
方法1:
Class2 *class2Object = [[Class2 alloc] init];
[self doSomething: class2Object];
[class2Object release];
-(void) doSomething: (Class2 *) var {
int a = var.a;
}
方法2:
Class2 *class2Object = [[Class2 alloc] init];
[self doSomething: &class2Object];
[class2Object release];
-(void) doSomething: (Class2 **) var {
int a = var->a;
}
这两种方法之间有什么性能差异吗?第二种方法完全没有意义吗?为什么我可以在方法1中使用点表示法,而在方法2中必须使用->?
谢谢。
发布于 2011-11-14 18:58:22
,这两种方法之间有什么性能差异吗?
实际上,性能上的差异可以忽略不计,因为在方法2中还有一个间接(即指针去引用,也请参阅下面);因此,方法1将节省几个时钟周期。
是第二种完全没有意义的方法吗?
方法2很有用,例如,当您想要分配一个Class2类型的新实例并通过相同的参数将其传递给调用者时;例如:
- (bool)cloneObject:(Class2 **)var;
传入一个对象;该对象被克隆并在var中返回;由于更改的是对象本身的地址,因此需要有指向对象指针的指针才能设置新地址;返回值仅声明操作是否正确执行。
当然,在本例中,更自然的做法是:
- (Class2)cloneObject:(Class2*)var;
也就是说,将指针返回到新分配的对象,但用例仍然有效。
为什么我可以在方法1中使用点表示法,而在方法2中必须使用->?
在第二种情况下,您必须使用->
,因为您不是直接处理指向对象的指针;而是处理指向对象的指针;在这种情况下,您需要做的是“取消引用”您的指针(即应用运算符*),以便获得指向对象的指针,然后像其他方式一样访问对象;可以这样写:
(*var).a
在这里,var
是指向Class2
对象的指针;*var
是取消引用它的结果,因此您有一个指向Class2
对象的指针;最后,.a
是访问对象属性的语法。语法:
var->a
只是上面描述的操作的“简写”。
https://stackoverflow.com/questions/8126309
复制相似问题