gpt4 book ai didi

objective-c - Objective C 中点符号和 -> 之间的区别

转载 作者:太空狗 更新时间:2023-10-30 03:59:03 24 4
gpt4 key购买 nike

我试图在我的代码中使用尽可能少的内存。我尝试了两种将自定义类对象发送到方法的方法。我不确定这两种方法之间是否有任何区别。假设我有 2 个类,Class1Class2,当然每个类都有自己的类变量和方法。

所有代码都写在Class1

方法一:

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 中必须使用 ->?

谢谢。

最佳答案

Is there any performance difference between these two methods?

确实,性能上的差异可以忽略不计,因为在方法 2 中您还有一个间接寻址(即指针解引用,另请参见下文);因此,方法 1 将为您节省几个时钟周期。

Is the second approach completely pointless?

方法 2 很有用,例如,当您想要分配一个 Class2 类型的新实例并通过相同的参数将其传回给调用者时;说:

 - (bool)cloneObject:(Class2 **)var;

你传入一个对象;该对象被克隆并在 var 中返回;因为改变的是对象本身的地址,所以您需要有一个指向对象指针的指针才能设置新地址;返回值仅说明操作是否正确执行。

当然,在这个例子中,这样做会更自然:

     - (Class2)cloneObject:(Class2*)var;

即,您返回指向新分配的对象的指针,但用例仍然成立。

Why is it that I can use the dot notation in Approach 1, but have to use -> in Approach 2?

在第二种情况下,您必须使用 ->,因为您不是直接处理指向对象的指针;您正在处理指向对象指针的指针;在这种情况下你需要做的是,首先,“取消引用”你的指针(即应用运算符*)以获得指向对象的指针,然后像其他方式一样访问后者;这可以这样写:

 (*var).a

这里,var是一个指向Class2对象的指针; *var 是取消引用它的结果,所以你有一个指向 Class2 对象的指针;最后,.a 是访问对象属性的语法。语法:

var->a

只是上述操作的“简写”。

关于objective-c - Objective C 中点符号和 -> 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8126309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com