objective-c union“ – >”vs“。”

首先让我说我对整个结构和联合事物都很陌生。 在发布这篇文章之前我已完成了我的作业,并诚实地试图获得合法的澄清。 如果这是错误的方式,请告诉我。 首先,我试图创建一个联合,因为我正在组合不同的数据类型。 我唯一真正的问题/问题是点运算符vs – >。 我可以得到我想用的工作

-> 

但不是

 . 

我只是好奇为什么? iv阅读堆栈上的一堆post,用“。”显示示例或“答案”,但在现实世界中没有运气。 我玩过“typedef”就像…

 typedef union _myUnion { int intValue; bool boolValue; }myUnion; 

但这并不能解决问题。 如果有人解释我做错了什么,将不胜感激。 这是我想要做的快速示例。 为了简单起见,我将发布一些struct / union语法,并且不会添加任何子类代码,因为这不是问题。

example.h文件

 #import "<Foundation/Foundation.h" union myUnion { int intValue; bool boolValue; }; @interface MyClass : NSObject { union myUnion *someProperty; } @property (nonatomic, assign) union myUnion *someProperty; -(void)doSomething; @end 

example.m

 #import "MyClass.h" @implementation MyClass @synthesize someProperty = _someProperty; - (id)init { //Some init method... } - (void)doSomething { NSLog(@"I Did Something..."); } @end 

所以现在在我的其他课上这个有用……

 MyClass *newObject = [MyClass alloc] init]; newObject.someProperty->intValue = 6; 

但这不……

 MyClass *newObject = [MyClass alloc] init]; newObject.someProperty.intValue = 6; 

在这个时间点,我更感兴趣的是为什么后者不起作用? 有趣的是,如果我取消属性的​​.h文件中的指针。

 @interface MyClass : NSObject { union myUnion someProperty; } @property (nonatomic, assign) union myUnion someProperty; 

“。” 工作而不是“ – >”,但现在它不可分配。

作为旁注,如果我将bool更改为int并使其成为结构,则会发生同样的事情。 不幸的是,我首先熟练掌握了Objective-c,并且随着我的进展慢慢地接受了严格的c。 所以我对c的理解有点弱,但这就是obc之美,我学习两种语言的价格就是一个! 如果你不算open-gl。

我会问,如果有人可以发布一个代码的工作示例,然后我可以弄清楚我做错了什么,或者彻底解释我做错了什么以及我错过了一些基本概念。 从那里我可以弄清楚如何编写自己的工作代码。 我不需要两者,并且不希望分手但是想学习,所以我可以解决我自己的问题,而不仅仅是修补错误的代码而不了解它是如何工作或为什么工作的。

a->b运算符是(*a).b简写 – 就像使用. 但先做一个解除引用。 当a是指针时,这是合适的。

因为在您的原始示例中someProperty是指向union的指针,所以您需要首先取消引用该指针。 这意味着你需要使用:

 (*newObject.someProperty).intValue // confusing! 

要么

 newObject.someProperty->intValue // much better 

访问它。

当然,一旦你将someProperty改为union而不是指向union的指针,你可以使用. 代替。 所以:

  • a->b :访问指针上的struct / union成员
  • ab :访问原始struct / union上的struct / union成员

在这种情况下,您很可能希望将union作为值 – 而不是指向外部存储器位置的指针:

 @interface MyClass : NSObject { union myUnion someProperty; // << no '*' } @end 

然后你使用成员访问的时间段:

 someProperty.intValue = 6; 

如果它是一个指针:

 someProperty->intValue = 6; 

但是,还有另一个问题。 您有两个(主要)选项可以将union用作属性。 值或指针。 这通常由值处理,尤其是当所有字段引用结构/联合的本地内存时,以及字段id不大时。 在这种情况下,您通常会返回并按值设置。 这意味着您的程序将按如下方式编写:

 @interface MyClass : NSObject { union myUnion someProperty; } @property (nonatomic, assign) union myUnion someProperty; // << by value @end 

然后客户端可以按值访问和设置它,如下所示:

 union myUnion p = obj.someProperty; ++p.intValue; obj.someProperty = p; 

而这就是通常使用不涉及共享资源的小型结构来实现的。

当然,如果您的实例可以直接访问它,您将不需要副本,如果您选择直接访问该字段:

 - (void)doSomething { ++someProperty.intValue; } 

如果这变得复杂, 抽象方法后面的数据可能是一个好主意,并将访问和变异留给持有联合的MyClass实例。