首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >目标C中点表示法与->的区别

目标C中点表示法与->的区别
EN

Stack Overflow用户
提问于 2011-11-14 18:30:04
回答 3查看 673关注 0票数 4

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

所有代码都是用Class1编写的

方法1:

代码语言:javascript
运行
复制
Class2 *class2Object = [[Class2 alloc] init];

[self doSomething: class2Object];

[class2Object release];

-(void) doSomething: (Class2 *) var {
int a = var.a;
}

方法2:

代码语言:javascript
运行
复制
Class2 *class2Object = [[Class2 alloc] init];

[self doSomething: &class2Object];

[class2Object release];

-(void) doSomething: (Class2 **) var {
int a = var->a;
}

这两种方法之间有什么性能差异吗?第二种方法完全没有意义吗?为什么我可以在方法1中使用点表示法,而在方法2中必须使用->?

谢谢。

EN

Stack Overflow用户

回答已采纳

发布于 2011-11-14 18:58:22

,这两种方法之间有什么性能差异吗?

实际上,性能上的差异可以忽略不计,因为在方法2中还有一个间接(即指针去引用,也请参阅下面);因此,方法1将节省几个时钟周期。

是第二种完全没有意义的方法吗?

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

代码语言:javascript
运行
复制
 - (bool)cloneObject:(Class2 **)var;

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

当然,在本例中,更自然的做法是:

代码语言:javascript
运行
复制
     - (Class2)cloneObject:(Class2*)var;

也就是说,将指针返回到新分配的对象,但用例仍然有效。

为什么我可以在方法1中使用点表示法,而在方法2中必须使用->?

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

代码语言:javascript
运行
复制
 (*var).a

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

代码语言:javascript
运行
复制
var->a

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

票数 4
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8126309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档