Iphone Objective-c->结构运算符
在阅读一些教程时,我第一次发现了structure操作符,我读到它是用来表示instace变量的Iphone Objective-c->结构运算符,iphone,ios,objective-c,c,cocoa,Iphone,Ios,Objective C,C,Cocoa,在阅读一些教程时,我第一次发现了structure操作符,我读到它是用来表示instace变量的 -(void)setNumber:(int)n{ self.number = n; } -(void)setNumber:(int)n{ self->number = n; } 我的疑问是:它到底在做什么?我什么时候用?为什么我更喜欢它而不是点符号 Objective-C中的点语法只是语法糖,编译器用方法调用替换它。->取消对指针的引用并直接访问成员,而无需调用方法 在Obje
-(void)setNumber:(int)n{
self.number = n;
}
-(void)setNumber:(int)n{
self->number = n;
}
我的疑问是:它到底在做什么?我什么时候用?为什么我更喜欢它而不是点符号 Objective-C中的点语法只是语法糖,编译器用方法调用替换它。->取消对指针的引用并直接访问成员,而无需调用方法
在Objective-C方法调用中,您不需要说self->foo,如果您的类有一个名为foo的实例变量,编译器将推断它的self->部分。因此,虽然并非完全没有听说过,但在Objective-C对象中使用->的情况相对较少。Objective-C中的点语法只是语法糖,编译器通过方法调用将其替换。->取消对指针的引用并直接访问成员,而无需调用方法 在Objective-C方法调用中,您不需要说self->foo,如果您的类有一个名为foo的实例变量,编译器将推断它的self->部分。因此,虽然并非完全没有听说过,但在Objective-C对象中使用->的情况相对较少。箭头->操作符直接访问实例变量,这通常是不希望的,因为它违反了封装并绕过了可能成为潜在问题源的访问器方法,比如KVO不工作或者一些期望的副作用没有发生 相反,您几乎应该始终使用.,因为它使用getter和setter访问属性。箭头->运算符直接访问实例变量,这通常是您不希望的,因为它违反了封装,并绕过了可能成为潜在问题源的访问器方法,比如KVO不工作或者一些期望的副作用没有发生
相反,您几乎应该始终使用.,因为它使用getter和setter来访问属性。请记住,Objective-C是在C之上构建的,所有的C语法都会显示出来。基本上,->的C语义没有改变,而是被带入了Objective-C,而额外的语义被重载到了,。与该标记在C中的含义相比。在尝试学习/使用Objective-C之前,您需要至少对C有一个基本的了解。请记住,Objective-C是建立在C之上的,所有的C语法都显示出来了。基本上,->的C语义被继承到Objective-C中,没有改变,而额外的语义被重载到,。而这个标记在C中的意思是什么。在你尝试学习/使用Objective-C之前,你需要至少对C有一个基本的了解。为什么他们不删除这种语法?它只会导致Trubles仍然合法使用直接访问非自身实例的实例变量-例如,在实现NSCopying时很有用,更不用说->在C中仍然有大量合法使用,其中Objective-C是一个严格的超集。他们为什么不删除这种语法?它只会导致truble仍然合法使用直接访问非自身实例的实例变量-例如,在实现NSCopying时很有用,更不用说->在C中仍然有大量合法使用,其中Objective-C是一个严格的超集。OP发布了一个访问器方法实现的示例。在这些情况下,直接访问ivar是正确和常见的。在某些情况下,需要使用箭头符号,并且有意义。此外,Objective-C是C的严格超集,不能删除C功能。@请参阅ipmcc关于NSCopying的评论。实现isEqual:或compare:是类似的情况。@NikolaiRuhe即使在访问器方法中也不需要箭头运算符。在任何实例方法中,都可以访问ivar,而无需将其作为self->ivar引用。此外,这个答案在技术上是正确的,因此您的下一票是无效的。@H2CO3箭头运算符完全可以在访问器中使用,就像在其他任何地方一样。OP发布了一个访问器方法实现的示例。在这些情况下,直接访问ivar是正确和常见的。在某些情况下,需要使用箭头符号,并且有意义。此外,Objective-C是C的严格超集,不能删除C功能。@请参阅ipmcc关于NSCopying的评论。实现isEqual:或compare:是类似的情况。@NikolaiRuhe即使在访问器方法中也不需要箭头运算符。在任何实例方法中,都可以访问ivar,而无需将其作为self->ivar引用。此外,这个答案在技术上是正确的,因此您的下一票是无效的。@H2CO3箭头运算符完全可以在访问器中使用,就像在其他任何地方一样。